n 1 k z z z Asked:2022-05-27 16:54:38 +0800 CST2022-05-27 16:54:38 +0800 CST 2022-05-27 16:54:38 +0800 CST C ++中的内存段“只读” 772 什么是“只读”内存段,那里有什么数据? архитектура 1 个回答 Voted Best Answer nick_n_a 2022-05-28T18:33:04+08:002022-05-28T18:33:04+08:00 在节目方面。 只读内存段 - 通常,常量会到达那里。类信息也被认为是一个常量——虚拟表、类型信息等。“段”更多是链接器的概念。这是向链接器发出的信号,表明此数据需要放在读取部分中。该部分还包括编译器开发人员制定的各种服务数据。一些编译器在那里留下他们的签名。 常数是否会落入该段是不必要的。如果我们创建一个常量——那么它可能不明确存在——即 它只是在代码段中。a)如果我们写const int a= 1; ,那么 subа可能根本不会在段中保留。该值将直接在代码中提供。 b)添加f(&a)对常量的引用。如果编译器不能简化代码,那么为了得到常量的地址,就必须把它写在某个地方。然后编译器会将它放在读段中。c)该标准不保证所有常量都必须在只读段中。如果编译器未能将常量放置在只读段中,那么它可以将其放置在堆栈中,它不会是只读的。 在编译器之后,程序由链接器处理。只读段的确切放置位置也取决于链接器。我遇到了一些编译器/链接器将程序代码和常量组合在一起。因此,如果需要有关放置的更准确信息,那么实际上必须查看编译器的每个单独版本。 从硬件的角度来看。有不同的平台。一些平台支持只读内存页面分配,而另一些则不支持。只有当平台支持此选项时,Readonly 才会起作用。在 x86 中,页面大小通常为 4k。现代 PC 可能具有更大的页面大小。只读段可以跨越一个或多个尺寸过小的页面(即内存可能被过度分配)。许多现代微控制器还支持内存页面的写保护,例如 stm32。 VirtualQuery对于windows ,可以通过函数、、、、、、查看内存页IsBadCodePtr的状态。IsBadReadPtrIsBadStringPtrAIsBadStringPtrW``IsBadWritePtr 编译器放置这个或那个变量的位置可以在详细的映射文件中找到。
在节目方面。
只读内存段 - 通常,常量会到达那里。类信息也被认为是一个常量——虚拟表、类型信息等。“段”更多是链接器的概念。这是向链接器发出的信号,表明此数据需要放在读取部分中。该部分还包括编译器开发人员制定的各种服务数据。一些编译器在那里留下他们的签名。
常数是否会落入该段是不必要的。如果我们创建一个常量——那么它可能不明确存在——即 它只是在代码段中。a)如果我们写
const int a= 1;
,那么 subа
可能根本不会在段中保留。该值将直接在代码中提供。 b)添加f(&a)
对常量的引用。如果编译器不能简化代码,那么为了得到常量的地址,就必须把它写在某个地方。然后编译器会将它放在读段中。c)该标准不保证所有常量都必须在只读段中。如果编译器未能将常量放置在只读段中,那么它可以将其放置在堆栈中,它不会是只读的。在编译器之后,程序由链接器处理。只读段的确切放置位置也取决于链接器。我遇到了一些编译器/链接器将程序代码和常量组合在一起。因此,如果需要有关放置的更准确信息,那么实际上必须查看编译器的每个单独版本。
从硬件的角度来看。有不同的平台。一些平台支持只读内存页面分配,而另一些则不支持。只有当平台支持此选项时,Readonly 才会起作用。在 x86 中,页面大小通常为 4k。现代 PC 可能具有更大的页面大小。只读段可以跨越一个或多个尺寸过小的页面(即内存可能被过度分配)。许多现代微控制器还支持内存页面的写保护,例如 stm32。
VirtualQuery
对于windows ,可以通过函数、、、、、、查看内存页IsBadCodePtr
的状态。IsBadReadPtr
IsBadStringPtrA
IsBadStringPtrW``IsBadWritePtr
编译器放置这个或那个变量的位置可以在详细的映射文件中找到。