假设我有一个 const 全局变量,因此它是只读的,并将被放置在 .rodata 部分中。我正在使用 -O3 优化来编译代码。这将使编译器(即 GCC)在读取变量时根据变量本身的值生成不同的代码。例如,如果变量定义为零或适合 ISA 指令立即数字段的足够小的值,则它将使用单个指令。如果它很大,可能会使用多个指令。我希望生成的代码与值无关。我尝试将其声明为
volatile const
,这似乎有效,因为它总是生成加载指令来读取值,但 GCC 似乎忽略了 const 字段并将其放置在 .data 部分中。另外,我尝试声明__attribute__((section(".rodata")) volatile
。这导致警告“警告:为 .rodata 设置不正确的部分属性”。
这样我就不会陷入“XY问题”问题,我还想说我的主要目标是让这段代码生成一个尽可能相同的最终二进制文件(即,位于相同地址的部分与相同的大小),与这些 const 变量的值无关,这些变量来自编译时生成的宏。另外,我希望这些 const 值位于只读数据部分,这样它们在页表中标记为 RO,并且在运行时不会被损坏。
关于如何实现我的目标有什么建议吗?
您可以在不同的翻译单元中定义变量,即
variables.c
:
const int x = 42;
然后在其他地方使用
extern const int x;
然后,除非您使用链接时优化,否则编译器只需在其他翻译单元中发出正确的读取,因为否则它不会知道。
您可以使用 X 宏在一个地方执行这些操作,这样您就可以使用类似的东西
DEFINE_CONST_VAR(int, x, 42);
在
#include
中,每个变量只需一次。