tri*_*san 14 c c++ memory string static
据我所知,编译时类C字符串只作为一个实例保存在静态内存中.例如,我true在下面的gcc 4.6运行示例中得到了两个.但我想知道它总是真的可以携带.C和C++上的行为很有趣.
#include <iostream>
bool amIportable(const char* value) {
const char* slocal = "Hello";
return (slocal==value);
}
int main() {
const char* s = "Hello";
std::cout << std::boolalpha
<< amIportable(s) << '\n'
<< amIportable("Hello") << '\n';
}
Run Code Online (Sandbox Code Playgroud)
Cod*_*ray 12
不,这并非总是如此,也不是便携式的.
合并相同的字符串文字是由编译器和链接器协同执行的优化.GCC和Microsoft编译器的最新版本都支持它,但仅在设置了某些优化开关时才支持它.
而且它不仅仅是一个"开"或"关"功能.不同的编译器和不同的优化设置也会影响执行的积极程度.例如,有时字符串文字仅在单个函数的范围内汇集,有时它发生在转换单元的级别,有时链接器可能涉及跨多个转换单元执行它.
这是允许的,因为C和C++标准将此行为视为依赖于实现.
不,它的实现依赖于C和C++.
C11§6.4.5/ 7 字符串文字
如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
C++11§2.14.5/ 12 字符串文字
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的.尝试修改字符串文字的效果是未定义的.
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |