gpt4 book ai didi

c++ - constexprs 是否存储在 .rodata 部分

转载 作者:太空宇宙 更新时间:2023-11-04 14:05:52 26 4
gpt4 key购买 nike

我读了c++11 faq并找到这句话:

Typically we want the compile-time evaluation guarantee for global or namespace objects, often for objects we want to place in read-only storage.

我想看看我的编译器(gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) )是如何工作的,所以我写了下面的代码:

#include <iostream>
using namespace std;
constexpr int add5(int i){
return i+5;
}
int main(int argc,char*argv[])
{
constexpr int read_only = add5(10);
cout << &read_only <<endl;
return 0;
}

我以为 read-only 会出现在 .rodata 部分,但它没有出现。显然人们可能认为编译器进行了优化。在这种观点下,我认为几乎每一个常量表达式都可以存储在编译器的表中,而不是省略到目标代码中。如果有退出,一些常量表达式应该存在于只读存储的目标代码中,以备更好的场合使用。

~$: ./constexpr 
0x7fff622addec
~$: cat /proc/3051/maps
7fff6228e000-7fff622af000 rw-p 00000000 00:00 0 [stack]

更新:

我不太理解我特别引用的粗体部分的句子。
正如下面的注释,read_only 是一个局部变量,它将作为上面的结果出现在堆栈中。如果我们不谈论全局数据或命名空间是没有意义的:

#include <iostream>
using namespace std;
constexpr int add5(int i){
return i+5;
}
constexpr int read_only = add5(10);
int global_int = add5(10);
int main(int argc,char*argv[])
{
cout << &read_only <<endl;
cout << &global_int <<endl;
getchar();
return 0;
}


~$: ./constexpr
0x4009b8
0x601068
~$: cat /proc/3157/maps
00400000-00401000 r-xp 00000000 08:09 1200603 /home/shia/constexpr
00600000-00601000 r--p 00000000 08:09 1200603 /home/shia/constexpr
00601000-00602000 rw-p 00001000 08:09 1200603 /home/shia/constexpr

它按我的预期工作。关于用前缀 const 声明的全局变量:

A variable or data member declared with constexpr behaves as if it was declared with const, except that it requires initialization before use and its initializer must be a constant-expression. Therefore a constexpr variable can always be used as part of a constant expression

所以,它也应该出现在.rodata部分。

最佳答案

您已经声明了一个局部变量。如果函数是递归的或者程序是多线程的,你可以同时拥有两个。两个不同的对象不能有相同的地址,因为在C++中对象的定义是一个具有唯一地址的东西。

如前所述,无法保证 constexpr 变量初始化不会在运行时求值。允许编译器使用读写内存并调用 add5 甚至是全局变量。不过,在这种情况下,这无关紧要。它需要将局部变量放在那里来跳舞,这样它才能有一个正确的地址。

此外,除了性能之外,您(用户)不能看到在运行时进行初始化的程序与仅在编译时求值的程序之间的区别。任何辨别它的实验都必然会默认返回到运行时评估行为。

如果您不获取其地址,则该要求不再适用。然后它可以从堆栈中消失,并完全从运行时操作中消失。

关于c++ - constexprs 是否存储在 .rodata 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16985643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com