Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应用程序的内存布局_C++_C_Memory_Memory Management - Fatal编程技术网

C++ 应用程序的内存布局

C++ 应用程序的内存布局,c++,c,memory,memory-management,C++,C,Memory,Memory Management,下面的问题让我头疼。假设我有两个平台 使用相同的硬件、相同的操作系统和相同的编译器。如果我编译的是 相同的应用程序,我可以确保两台机器上的内存布局完全相同吗?换句话说,两个应用程序都有相同的虚拟地址空间,或者 很可能情况并非如此 谢谢你的想法 你不能指望它。作为一种安全特性,一些操作系统(包括Windows)在一定程度上随机调整内存布局 (这里有一个支持链接:)你不能指望它。作为一种安全特性,一些操作系统(包括Windows)在一定程度上随机调整内存布局 (这里有一个支持链接:)除了史蒂文指出的

下面的问题让我头疼。假设我有两个平台 使用相同的硬件、相同的操作系统和相同的编译器。如果我编译的是 相同的应用程序,我可以确保两台机器上的内存布局完全相同吗?换句话说,两个应用程序都有相同的虚拟地址空间,或者 很可能情况并非如此


谢谢你的想法

你不能指望它。作为一种安全特性,一些操作系统(包括Windows)在一定程度上随机调整内存布局


(这里有一个支持链接:)

你不能指望它。作为一种安全特性,一些操作系统(包括Windows)在一定程度上随机调整内存布局


(这里有一个支持链接:)

除了史蒂文指出的堆栈地址等动态问题外,还有编译时和静态布局方面的问题

我已经认为两台机器完全是彼此的克隆,这是一种非常特殊的情况,因为CPU版本、库等方面可能有微小的差异。然后一些编译器(可能取决于某些选项)也将编译时间和日期放在可执行文件中。例如,如果您的两个主机名具有不同的长度,或者这使用了长度不同的日期格式,则不仅这些字符串会不同,而且所有其他静态变量可能会在地址空间中稍微移动


我记得,
gcc
在一些自动构建的架构上遇到了困难,因为在第2阶段生成的编译器与在第3阶段生成的编译器由于愚蠢的原因不同。

除了史蒂文指出的堆栈地址等动态问题,还有编译时和静态布局方面

我已经认为两台机器完全是彼此的克隆,这是一种非常特殊的情况,因为CPU版本、库等方面可能有微小的差异。然后一些编译器(可能取决于某些选项)也将编译时间和日期放在可执行文件中。例如,如果您的两个主机名具有不同的长度,或者这使用了长度不同的日期格式,则不仅这些字符串会不同,而且所有其他静态变量可能会在地址空间中稍微移动


我记得,
gcc
在一些自动构建的体系结构上遇到了困难,因为在第2阶段生成的编译器与在第3阶段生成的编译器由于如此愚蠢的原因不同。
宏扩展到(开始)编译时间。此外,它是确定的
独立于编译的每个.cpp文件,链接器可以消除重复字符串

因此,根据编译速度的不同,您的可执行文件可能不仅会有不同的
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
字符串,甚至会有不同数量的
\uuuuuuuuuuuuuuuuuuuuuuuuuu
字符串


如果您工作到很晚,您可以在
\uuuuu DATE\uuuuu
strings;)中看到同样的情况

宏扩展到编译时间(开始)。此外,它是确定的 独立于编译的每个.cpp文件,链接器可以消除重复字符串

因此,根据编译速度的不同,您的可执行文件可能不仅会有不同的
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
字符串,甚至会有不同数量的
\uuuuuuuuuuuuuuuuuuuuuuuuuu
字符串

如果您工作到很晚,您可以在
\uuuuu DATE\uuuuu
strings;)中看到同样的情况

它们是否可能具有相同的内存布局?是的,这是可能的。可能吗?不是真的

正如其他人所指出的那样,地址空间随机化和
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
宏之类的事情可能会导致地址空间不同(无论更改是在编译时还是在运行时进行的)。根据我的经验,许多编译器在同一台机器上使用完全相同的输入运行两次时不会产生相同的输出(函数在内存中以不同的顺序排列,等等)

这是一个修辞/智力问题,还是这会导致您在编写程序时遇到某种问题?

它们是否可能具有相同的内存布局?是的,这是可能的。可能吗?不是真的

正如其他人所指出的那样,地址空间随机化和
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
宏之类的事情可能会导致地址空间不同(无论更改是在编译时还是在运行时进行的)。根据我的经验,许多编译器在同一台机器上使用完全相同的输入运行两次时不会产生相同的输出(函数在内存中以不同的顺序排列,等等)


这是一个修辞/智力问题,还是这会导致您编写的程序遇到某种问题?

应用程序在同一平台上的同一地址空间中执行,但在另一台计算机上执行,这是极不可能的。其他应用程序可能正在运行,这将影响操作系统加载应用程序的位置

另一个要考虑的问题是,某些应用程序按需加载运行时库(A.K.DLLS和共享库)。在应用程序运行时,应用程序可能已加载或未加载一些DLL

在非嵌入式平台中,大多数应用程序并不关心确切的物理内存位置,也不关心它们每次都加载在同一位置。大多数嵌入式平台每次都在同一个地方加载应用程序,因为它们没有足够的内存来移动应用程序


由于这些情况和其他人提到的情况,请不要将恒定内存位置原则编码到程序中。非常糟糕的事情会发生,特别是难以跟踪和调试

应用程序在同一平台上的同一地址空间执行的可能性极低,