答案对实现有点敏感,但总的来说,不会。您g_glbarr
实际上是指向 的指针char
或地址。字符串本身会被放入带有常量字符串的数据段,并g_glbarr
在编译时成为字符串地址的符号。您最终不会为指针分配空间,编译器只是在链接时解析地址。
更新
@Jay,有点像。整数(通常)只是内联的:编译器将尽可能接近将常量放入代码中,因为这是一种常见的情况,大多数普通架构都有一种直接的方式来从直接数据中进行操作。字符串常量仍将位于某些只读数据段中。所以当你做类似的事情时:
// warning: I haven't compiled this and wouldn't normally
// do it quite this way so I'm not positive this is
// completely grammatical C
struct X {int a; char * b; } x = { 1, "Hello" } ;
成为1
“立即”数据,在"Hello"
某处分配只读数据,编译器只会生成一些分配一段读写数据的东西,看起来像
x:
x.a: WORD 1
x.b WORD @STR42
whereSTR42
是字符串"Hello"
在内存中位置的符号名称。然后,当所有内容链接在一起时,将@STR42
替换为内存中字符串的实际虚拟地址。