匿名对象存储在哪里?
Where are anonymous objects stored?
我希望它们存储在 text
段中,但简短的调查显示它们不是(我使用了 clang
编译器)。那么它们存储在哪里呢?指向匿名对象的指针是全局定义的(在任何范围之外),如下所示:
int *garr = (int[]){1, 2, 3, 4, 5};
void *grec = &(struct {float a; char b;}){0, 1};
我定义了一个指向字符串文字的指针和一些全局常量变量:
char *gstr = "Global string";
const short global_const = 5;
static const unsigned static_global_const = 10;
然后我为 data
段定义了一些变量,也是全局的:
int data_x = 1;
char data_y = 2;
static float data_z = 3;
然后我检查了所有这些地址和gstr
指针的内容,以了解text
和data
段在哪里。结果是这样的(lstr 是指向另一个字符串文字的指针,但在 main
范围内定义):
gstr == 0x4009a8
lstr == 0x400a18
&global_const == 0x400bb4
&static_global_const == 0x400bbc
&data_x == 0x601070
&data_y == 0x601074
Static: &data_z == 0x601078
我看到的是前 4 个地址来自 text
段,而后 3 个地址来自 data
段。我原以为匿名对象会在前 4 个地址附近,但我看到了这个:
garr == 0x601040
grec == 0x601060
对我来说,它们似乎存储在 data
段中,即使这些对象是只读文字。为什么?
编译器通常将字符串文字放在只读部分中,因为它们是只读的。同样,初始化的非只读数据被放入可修改的数据部分,因为这就是它的用途。
复合文字不是只读的,除非它是用 const 限定类型定义的,因此编译器可能会将非 const 限定的复合文字放在可修改的部分中。
(当然,C 标准允许 C 实现随心所欲地安排内存,因此编译器没有义务将用于其他数据的复合文字使用相同的部分。)
我希望它们存储在 text
段中,但简短的调查显示它们不是(我使用了 clang
编译器)。那么它们存储在哪里呢?指向匿名对象的指针是全局定义的(在任何范围之外),如下所示:
int *garr = (int[]){1, 2, 3, 4, 5};
void *grec = &(struct {float a; char b;}){0, 1};
我定义了一个指向字符串文字的指针和一些全局常量变量:
char *gstr = "Global string";
const short global_const = 5;
static const unsigned static_global_const = 10;
然后我为 data
段定义了一些变量,也是全局的:
int data_x = 1;
char data_y = 2;
static float data_z = 3;
然后我检查了所有这些地址和gstr
指针的内容,以了解text
和data
段在哪里。结果是这样的(lstr 是指向另一个字符串文字的指针,但在 main
范围内定义):
gstr == 0x4009a8
lstr == 0x400a18
&global_const == 0x400bb4
&static_global_const == 0x400bbc
&data_x == 0x601070
&data_y == 0x601074
Static: &data_z == 0x601078
我看到的是前 4 个地址来自 text
段,而后 3 个地址来自 data
段。我原以为匿名对象会在前 4 个地址附近,但我看到了这个:
garr == 0x601040
grec == 0x601060
对我来说,它们似乎存储在 data
段中,即使这些对象是只读文字。为什么?
编译器通常将字符串文字放在只读部分中,因为它们是只读的。同样,初始化的非只读数据被放入可修改的数据部分,因为这就是它的用途。
复合文字不是只读的,除非它是用 const 限定类型定义的,因此编译器可能会将非 const 限定的复合文字放在可修改的部分中。
(当然,C 标准允许 C 实现随心所欲地安排内存,因此编译器没有义务将用于其他数据的复合文字使用相同的部分。)