【发布时间】:2015-01-15 06:44:04
【问题描述】:
众所周知,优化 C(也可能是 C++)编译器会破坏执行以下操作的代码:
type1 foo, *pfoo;
type2_incompatible_with_type1 *pbar;
/* ... */
pfoo = &foo;
pbar = (type2_incompatible_with_type1*)pfoo;
/* ... */
while(condition){
change_type2_value(pbar);
/* ... */
use_type1_value_which_should_have_changed(*pfoo);
/* ... */
}
change_type2_value 看起来像这样:
void change_type2_value(type2_incompatible_with_type1 *pbar){
*pbar = SOME_VALUE;
}
编译器可能会认为pfoo 和pbar 是不同的指针,尽管它们指向相同的内存位置,因此,每次我们更改@ 指向的值时,都不需要重新加载*pfoo 的内容987654326@,即使它也改变了pfoo指向的内存。
但是,如果我们这样做:
type1 foo, *pfoo;
/* ... */
pfoo = &foo;
/* ... */
while(condition){
change_type2_value((type2_incompatible_with_type1*)pfoo);
/* ... */
use_type1_value_which_should_have_changed(*pfoo);
/* ... */
}
虽然取消引用会发生在change_type2_value 函数内,但这在技术上仍然破坏了严格的别名,因为实际上,我们的指针指向不同的类型。但是,是否存在真正的编译器使用的严格别名优化也会破坏这段代码的实际情况?
我认为,如果编译器超出当前函数的范围来查看 另一个 函数中应该发生的事情,只是为了确定它是否应该重新加载指向的内存,这是有可能的已传递给它的变量。这对我来说似乎不太可行。
或者一个真正的编译器是否有可能做一些令人讨厌的事情,假设如果我们将它作为 cast 传递,所讨论的函数将不会改变我们的指针指向的内存指向不兼容类型的指针?
【问题讨论】:
-
你有多喜欢玩火?如果你搞砸了,你可能迟早会被烧死——无论你是在玩火还是严格的混叠违规。
标签: c pointers compiler-optimization strict-aliasing