指定c中全局变量的布局



考虑这段代码,其中定义了两个全局变量:

int a;
int b;

据我所知,编译器可能会或可能不会将ab放在相邻的内存位置(请让我知道这是否不正确)。例如,在GCC中,可以使用-fdata-sections编译并重新排序两个部分或其他。

是否有可能指定ab必须相邻(在&a + 1 == &b的意义上),在标准或GNU扩展C中?

背景:我正在制作一个OpenGL加载器,这是字面上(省略类型转换):

void (*glActiveShaderProgram)(GLuint, GLuint);
void (*glActiveTexture)(GLenum);
...
void load_gl(void (*(*loader)(char *))()) {
glActiveShaderProgram = load("glActiveShaderProgram");
glActiveTexture = load("glActiveTexture");
...
}

很简单,但是每次调用load都会编译成调用load。由于要加载的函数相对较多,因此会占用大量代码空间。(这就是我放下glad的原因。)

所以我有这样的东西,它减少了大约30kB的二进制大小,这对我来说非常重要:

char names[] = "glActiveShaderProgram glActiveTexture ...";
char *p = names, *pp;
for (int i = 0; i < COUNT; ++i) {
pp = strchr(names, ' ');
*pp = '';
(&glActiveShaderProgram)[i] = load(p);
p = pp + 1;
}

但这确实假设了这些函数指针的特定布局。目前,我将函数指针包装在一个结构体中,该结构体被类型双关成指针数组,如下所示:

union { struct {
void (*glActiveShaderProgram)(GLuint, GLuint);
void (*glActiveTexture)(GLenum);
...
}; void (*table[COUNT])(); } gl;

但是为了让用户满意,每个功能都需要一个#define。所以我想知道是否存在一些更优雅的方式来指定全局变量的布局。

正如Ted在评论中建议的那样。你可以把数组里的变量放在一起吗?

int ab[2] = {a, b};

另一种确保相邻内存位置的方法是使用打包结构体。示例更多信息

最新更新