在c中,有哪些规则可以控制编译器如何将相同的字符串合并到可执行文件中

ash*_*gpu 4 c compiler-construction

我试图找到c和c ++编译器的规则是什么,将字符串放入可执行文件的数据部分,不知道在哪里看.我想知道以下所有地址在c/c ++中是否保证与规范相同:

char * test1 = "hello";
const char * test2 = "hello";
static char * test3 = "hello";
static const char * test4 = "hello";
extern const char * test5; // Defined in another compilation unit as "hello"
extern const char * test6; // Defined in another shared object as "hello"
Run Code Online (Sandbox Code Playgroud)

在Windows上进行测试,它们都是一样的.但是我不知道它们是否适用于所有操作系统.

oua*_*uah 8

我想知道以下所有地址是否符合规范c/c ++中的相同

字符串文字允许是同一个对象,但不是必需的.

C++说:

(C++ 11,2.14.5p12)"是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的.尝试修改字符串文字的效果是不确定的."

C说:

(C11,6.5.2.5p7)"字符串文字和具有const限定类型的复合文字不需要指定不同的对象.1101)这允许实现共享字符串文字和常量复合文字的存储,具有相同或重叠的表示."

而C99理由说:

"此规范允许实现共享具有相同文本的字符串副本,将字符串文字放在只读内存中,并执行某些优化"