我正在阅读an article about whole program optimization。链接时代码生成部分的最后一段表示将堆栈上分配的数组归零可能不会产生相同的效果,具体取决于它的归零方式:
启用整个程序优化确实发现了一些具有未定义行为的错误。没有WPO,这些都不会崩溃。通过WPO,他们做到了。在一种情况下,通过指向未初始化的内存的指针进行成员函数调用。在其他几种情况下,假设堆栈上的数组与它们自己的地址相同。 也就是说,假设memset(& charArray,0,sizeof(charArray))与memset具有相同的效果(charArray,0,sizeof(charArray))。标准不保证这一点,并且在WPO下似乎有所改变。
我想如果我char foo[1]
foo
总是==
到&foo
。有人能解释一下这里发生了什么吗?感谢
答案 0 :(得分:5)
foo
是一个数组,表达式foo
将转换为指向其第一个元素的指针,除非是一元&
和sizeof
运算符的操作数。所以,在这种情况下foo == &foo[0]
。 &foo
是数组foo
的地址,而不是foo
的第一个元素的地址。
虽然foo
和&foo
的值相同,但它们的类型不同。衰变后foo
类型为char *
,&foo
类型为char (*)[1]
。