何时进行混叠
When to assume aliasing
本文关键字:何时进 更新时间:2023-10-16
我正在复习关于严格别名的知识,我偶然发现了一篇著名的文章:什么是严格别名规则,我们为什么在乎?
signed int foo( const signed int &si1, int &si2); // Hard to show this one assumes aliasing
但我在理解这句话时遇到了问题:"很难显示这个假设是混叠的"。在这种情况下,这意味着什么?我觉得这些语句想指出si1
和si2
可能(也可能不(引用同一个对象?但我不确定。
请参阅上面关于的示例
signed int foo( signed int &si, unsigned int &ui ) {
在解释中,您可以从编译器的输出中看到优化器确实假设存在混叠。
列表中的所有示例都是编译器必须"假定别名"的情况,因为这些项是允许别名的项。在"//很难显示这个假设有别名"中,作者只是说,从编译器的输出中,与之前的例子相比,不容易看出这种情况。
我觉得这些语句想指出si1和si2可能(也可能不(引用同一个对象?
列表中的所有项目都是这样。这是一个特殊情况列表,允许不同类型的变量引用同一对象。该语句是关于如何在编译器输出中看到规则的效果。
换句话说:一般情况下,倾斜是不允许的。因此,编译器可以安全地假设不同类型的指针或引用不引用同一对象。优化器一直都是这样做的:它假设您编写的代码符合规则。然后,它将转换应用于代码,从而产生完全相同的可观察行为。这一切都是在您编写了有效代码的假设下进行的。在这种情况下,编译器必须更加谨慎,因为列出的异常给了您更多的自由,而给了优化器更少的自由。现在,它不能假设两个不同类型的引用从不引用同一个对象,而是必须"假设存在别名"(这略微限制了优化的可能性(。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 何时在引用或唯一指针上使用移动语义
- 何时提供默认参数作为模板参数
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- C++-明确何时以及如何调用析构函数
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- clang格式:宏的缩进
- C++setiosflags函数操纵器-未确定的缩进
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 用c++把小数点转换成八进制
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 指向存储在字符串 c++ 中的十六进制
- 需要反转音频步进公式
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?