假设我有一个const全局变量,因此它是只读的,将放在.rodata部分中.我正在使用-o3优化来编译代码.这将使编译器(即GCC)在读取变量时根据变量本身的值生成不同的代码.例如,如果变量被定义为适合ISA指令立即字段的零或足够小的值,则它将使用单个指令.如果它很大,它可能会使用几条指令.我希望生成的代码是相同的,独立于值.我try 将其声明为volatile const,这似乎很有效,因为它总是生成读取该值的加载指令,但GCC似乎忽略了const字段,并将其放在.Data部分中.另外,我试着申报了__attribute__((section(".rodata")) volatile.这导致了警告"警告:为.rodata设置不正确的节属性".

为了不陷入"XY问题",我还想说,我的主要目标是让这段代码生成一个尽可能相同的最终二进制文件(即,相同地址、相同大小的节),独立于这些常量变量的值,这些常量变量来自编译时生成的宏.另外,我希望这些常量值位于只读数据部分,以便它们在页表中被标记为RO,并且在运行时不会被 destruct .

对如何实现我的目标有什么建议吗?

推荐答案

除非您启用了链接时间优化,否则编译器通常可以执行这些优化only if您在相同的.c文件(翻译单元)中定义了变量.

因此,您可以在不同的翻译单位中定义变量,例如const.c:

const int x = 42;

然后在其他地方使用

extern const int x;

那么,除非你使用链接时优化,否则编译器只需要在其他翻译单元中发出正确的读取,因为它不知道其他情况.


您可以在一个地方使用X宏来完成这些操作,这样您就可以使用类似于

DEFINE_CONST_VAR(int, x, 42);

#include中,每个变量只有一次.

C++相关问答推荐

有什么方法可以检测SunOS上的SparcWorks吗?

使用单个字节内的位字段

getchar读css + z还是返回css?

C指针算法在函数参数中的应用

为什么双重打印与C中的float具有不同的大小时具有相同的值?

#If指令中未定义宏?

ATmega328P EEPROM未写入

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

在我的代码中,我需要在哪里编写输出函数?

将数据移动到寄存器时出现分段故障

1处的解析器错误:yacc语法的语法错误

处理EPOLL_WAIT中的接收数据和连接关闭信号

S和查尔有什么不同[1]?

仅从限制指针参数声明推断非混叠

是否有单独的缓冲区用于读写库调用?

C循环条件内的函数

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

为什么实现文件中的自由函数默认没有内部链接?

如何正确探测平台设备?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组