opengl 指定C语言中全局变量的布局

afdcj2ne  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(111)

请看下面这段代码,其中定义了两个全局变量:

int a;
int b;

据我所知,编译器可能会也可能不会将ab放在相邻的内存位置(如果这是不正确的,请告诉我)。例如,使用GCC,可以使用-fdata-sections进行编译,并重新排序这两个部分或其他内容。
在标准或GNU扩展C中,是否可以指定ab必须相邻(在&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,所以我想知道是否有更优雅的方法来指定全局变量的布局。

kr98yfug

kr98yfug1#

就像Ted在评论中建议的那样。你可以把变量放在一个数组中彼此相邻吗?

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

另一种确保相邻内存位置的方法是使用压缩结构。example
more info

相关问题