我在读一篇关于全程序优化的文章。链接时间代码生成部分的最后一段说,对分配到堆栈上的数组进行归零可能不会产生相同的效果,这取决于它是如何归零的:
启动整个程序优化确实发现了一些有未定义行为的错误。如果没有WPO,这些就没有崩溃。对于WPO,他们做到了。在一种情况下,成员函数调用是通过指向未初始化内存的指针进行的。在其他几种情况下,假设堆栈上的数组与它们自己的地址相同。,即假设memset(&charArray,0,sizeof(charArray))具有与memset相同的效果(charArray,0,sizeof(charArray))。这不是标准所保证的,似乎在WPO.下发生了变化。
我想如果我这么做的话,char foo[1] foo将永远是== to &foo。有人能解释一下这里发生了什么吗?谢谢
发布于 2016-06-05 20:23:26
foo是一个数组,在表达式中,foo将转换为指向其第一个元素的指针,除非是一元&和sizeof运算符的操作数。因此,在这种情况下,foo == &foo[0]。&foo是数组foo的地址,而不是foo的第一个元素的地址。
虽然foo和&foo的值是等价的,但它们的类型不同。foo衰变后为char *型,&foo为char (*)[1]型。
https://stackoverflow.com/questions/37646367
复制相似问题