请看下面这段代码,其中定义了两个全局变量:
int a;
int b;
据我所知,编译器可能会也可能不会将a
和b
放在相邻的内存位置(如果这是不正确的,请告诉我)。例如,使用GCC,可以使用-fdata-sections
进行编译,并重新排序这两个部分或其他内容。
在标准或GNU扩展C中,是否可以指定a
和b
必须相邻(在&a + 1 == &b
的意义上)?
背景:我正在制作一个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 = '\0';
(&glActiveShaderProgram)[i] = load(p);
p = pp + 1;
}
但是这是假设了这些函数指针的特定布局。目前我将函数指针 Package 在一个结构体中,该结构体被类型转换为一个指针数组,如下所示:
union { struct {
void (*glActiveShaderProgram)(GLuint, GLuint);
void (*glActiveTexture)(GLenum);
...
}; void (*table[COUNT])(); } gl;
但是为了让用户满意,每个函数都需要一个#define
,所以我想知道是否有更优雅的方法来指定全局变量的布局。
1条答案
按热度按时间kr98yfug1#
就像Ted在评论中建议的那样。你可以把变量放在一个数组中彼此相邻吗?
另一种确保相邻内存位置的方法是使用压缩结构。example
more info