c++ - "pointer not aliased by any other pointer"含义的持续时间是多少?

标签 c++ visual-c++ memory-management pointers pointer-aliasing

目前 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/

相关文章:

java - C++中的DWORD数据类型及其在Java中的转换

python - 使用 file/db 作为非常大的 numpy 数组的缓冲区来生成数据以防止溢出?

c - Linux C程序中如何设置全局变量在某个函数中只读,而在其他函数中可读写

c++ - 从复杂函数返回变量以在另一个函数中使用

c++ - 从c++ vector 中的指定索引中提取元素

memory-management - Erlang - 循环和内存分配

c++ - 在构造函数中为类名添加和省略模板参数之间的区别

c++ - 为什么 IDXGISwapChain::SetFullscreenState 无法全屏显示?

c++ - 在 KDE 上清除剪贴板

c++ - OpenCV调试