考虑这段代码,其中定义了两个全局变量:
int a;
int b;
据我所知,编译器可能会或可能不会将a
和b
放在相邻的内存位置(请让我知道这是否不正确)。例如,在GCC中,可以使用-fdata-sections
编译并重新排序两个部分或其他。
是否有可能指定a
和b
必须相邻(在&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};
另一种确保相邻内存位置的方法是使用打包结构体。示例更多信息