- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我读了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/
例如当我有: const char mesg [] = "Hello World"; 它直接放在 .rodata 但是当我有: const char* mesg = "Hello World"; 直接
这是我的链接描述文件: ENTRY(__startup) SECTIONS { . = 0x0000; .text : { *(.text) } . = . + 0x4000;
我正在尝试为没有虚拟内存(或者更准确地说是操作系统)的机器编写一个 C 程序,并且我在 .rodata 部分,或者更准确地说是那里的东西遇到了一些困难。出现的问题是,尽管在链接期间这些节位于明确定义的
出于好奇,我今天尝试运行这段代码(使用 gcc -m32 1.c 编译): int main(void) { // EB is the opcode for jmp rel/8 //
我正在尝试使 .rodata 部分位置与其关联的函数内存位置保持一致。我正在使用带有 STM32L4A6 微 Controller 的 GNU 编译器/链接器、裸机、plain-jane c。 我有一
我已经为我的问题创建了一个最小示例。在 c 文件中,我初始化了一个包含 16 个元素的数组。然后我用数组指针及其大小作为参数调用一个函数。该功能本身有效,我已经使用反汇编文件验证了这一点。堆栈指针初始
我不得不完全改写这个问题及其标题,因为我的初步分析结果是错误的(感谢所有提示和建议!)。问题的旧标题是: GCC -O3 打乱二进制文件并产生数据垃圾 事实证明它与优化级别无关,我也不确定数据是否是垃
我编译了一个 Hello World C 文件,只需要其中的一个部分(只有 hello world 函数)。 编译后的文件格式为 elf32-i386,包含 4 个部分:.rodata、.text.h
目标是将大量常量数据放入 .rodata 部分,以允许从其他翻译单元访问它。据我所知,如果声明为 static const,GCC 会将数据放入只读部分。但是这样就不可能在其他文件中声明为extern
嘿 friend 我陷入严重的链接错误,我收到这样的错误 referenced in section .rodata' of xxx defined in discarded section .tex
在共享库 (linux x86_64) 的 readelf --segments 输出中,前几个程序头是: Program Headers: Type Offset
我正在 Gentoo 中为 ARM Cortex M3 (Maple Mini) 交叉编译 C++,但在链接 elf 文件时似乎遇到了内存资源问题 /usr/libexec/gcc/arm-none-
我有大量使用 constexpr 构造函数构造的静态常量对象,因此它们会立即存储在最终二进制文件中,而无需任何构造函数调用。 由于我在低 RAM 系统(STM32 MCU)上工作,我想减少这些对象的内
C语言中的代码 char *c = "Hello world!"; 在 rodata 中存储 Hello world!\0 并使用指向它的指针初始化 c。我怎样才能用字符串以外的东西来做到这一点? 具
所以测试平台是Linux 32位 我用gcc生成一个quickSort的obj文件是这样的: gcc -S quickSort.c 并且生成的quickSort.o是一个可重定位的ELF: #file
我已经看到 .rodata 和 .rdata 都被用作段。我应该使用哪一个,它们之间有什么区别? 最佳答案 RODATA 用于 ELF并且 RDATA 用于 COFF . Mach-O 中最接近的等价
尝试在 x86 AT&T 程序集中编译简单的字符串大小写交换函数时遇到此错误。 我尝试查看其他出现此错误的问题,但没有一个足够相似来帮助解决我的情况。大多数人都在不同的库和文件中处理事物,但这里的情况
我读了c++11 faq并找到这句话: Typically we want the compile-time evaluation guarantee for global or namespace
我有“const char *x”变量,编译后它应该分配在 rodata 区域中。但是当我看到变量 x 正在某个数据区域中分配时。任何人都可以告诉是否有任何命令使 const 变量在 rodata 区
在我的 x86-64 内核中,我试图将 .rodata ELF 部分映射为只读。但是所有的字符串文字都存储在特定于文件的部分中,例如.rodata.str1.8。 GCC 是否有任何选项可以将所有字符
我是一名优秀的程序员,十分优秀!