目前 Visual C++ 附带运行时,其中 malloc()
装饰有 __declspec( restrict )
.
MSDN 说这个装饰告诉编译器malloc()
返回的指针不能被任何其他指针别名。好的,对 malloc()
的两次后续调用确实返回了不同的指针。但是如果我打电话会发生什么
void* memory1 = malloc( 10 );
free( memory1 );
void* memory2 = malloc( 10 );
//here memory1 may be equal to memory2
在这种情况下,两个指针可以指向完全相同的位置。这与 不能被任何其他指针别名 __declspec( restrict )
的含义有何关联?
最佳答案
因为一旦释放(内存 1),通过内存 1 指针访问任何东西都是未定义的行为(鼻恶魔,等等),因此编译器可以优化假设内存 2 没有被 malloc() 之后的任何其他指针别名打电话。
至于为什么这很重要,假设编译器本身没有关于 malloc() 语义的内部信息,即它像对待任何其他函数一样对待它,那么它不能假设返回的指针没有被任何其他别名指针。 __declspec(restrict)
(或等效于 GCC 中的 __attribute__((malloc))
)告诉编译器该指针未被任何其他指针别名,这允许进行一些优化否则不可能。
关于c++ - "pointer not aliased by any other pointer"含义的持续时间是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7526595/