C++ C++;标准保证字符串文本在程序二进制文件中存储为未经修改的文本?
例如,如果你有一个程序C++ C++;标准保证字符串文本在程序二进制文件中存储为未经修改的文本?,c++,standards,C++,Standards,例如,如果你有一个程序 int main() { const char* str = "1111111111111111111111111111111111111111111"; printf("%s", str); return 0; } 编译它时,如果在生成的二进制文件中搜索“1111111111111111111111111111111111”(忽略编码等问题),是否保证找到它,或者编译器是否允许生成代码,例如,分配堆内存,使用循环将其填充为“1”,然后修复对该
int main()
{
const char* str = "1111111111111111111111111111111111111111111";
printf("%s", str);
return 0;
}
编译它时,如果在生成的二进制文件中搜索“1111111111111111111111111111111111”(忽略编码等问题),是否保证找到它,或者编译器是否允许生成代码,例如,分配堆内存,使用循环将其填充为“1”,然后修复对该字符串文本的所有引用以指向堆内存?(然后确保它在正确的时间被解除分配,诸如此类)
我怀疑是否有任何实现能真正做到这一点。。。但是如果它符合标准,它会符合标准吗?C++没有任何“程序二进制”的概念,所以这个问题没有真正意义
保证是通过递增和取消引用指针
str
,获得字符串中的所有字符,即当程序运行时,字符串连续存储在内存中。我认为编译器没有任何理由这样做,而不是在编译程序中对其进行编码 不,标准没有说明字符串文本存储的位置和方式。这是一个实现细节。这将取决于编译代码的计算机的编译器和体系结构。C++标准不影响代码以二进制格式存储。 二进制存储不受C++标准
的影响。标准(我正在看2005年的工作草案,因为没有人没有钱买教科书…)规定的唯一内容是字符串文本的内容(无论是窄还是宽)、类型、存储持续时间、转义序列和相邻字符串文本的串联。瞧。@Fabrizio你什么意思?它将永远不会存储在std::vector@Fabrizio:它们只是数组。这就像是“你好”代码>被替换为foo(uu literal0)
,其中静态常量char u literal0[]={'H','i','\0'}代码>。只有当您确实按照“仿佛”规则这样做时(或者更确切地说,编译器无法证明,在未定义的行为中,您没有这样做),才会做出这种保证。当外部程序检查可执行文件的内存时,发生什么情况不由C++标准定义。