c++ - C/C++ : Optimization of pointers to string constants

标签 c++ c optimization string constants

看一下这段代码:

#include <iostream>
using namespace std;

int main()
{
    const char* str0 = "Watchmen";
    const char* str1 = "Watchmen";
    char* str2 = "Watchmen";
    char* str3 = "Watchmen";

    cerr << static_cast<void*>( const_cast<char*>( str0 ) ) << endl;
    cerr << static_cast<void*>( const_cast<char*>( str1 ) ) << endl;
    cerr << static_cast<void*>( str2 ) << endl;
    cerr << static_cast<void*>( str3 ) << endl;

    return 0;
}

这会产生如下输出:

0x443000
0x443000
0x443000
0x443000

这是在 Cygwin 下运行的 g++ 编译器上实现的。即使没有打开优化 (-O0),这些指针也都指向同一位置。

编译器是否总是进行大量优化,以至于搜索所有字符串常量以查看它们是否相等?这种行为可以信赖吗?

最佳答案

它不可靠,它是一种优化,不属于任何标准。

我已将代码的相应行更改为:

const char* str0 = "Watchmen";
const char* str1 = "atchmen";
char* str2 = "tchmen";
char* str3 = "chmen";

-O0 优化级别的输出为:

0x8048830
0x8048839
0x8048841
0x8048848

但对于 -O1 来说是:

0x80487c0
0x80487c1
0x80487c2
0x80487c3

正如您所看到的,GCC (v4.1.2) 在所有后续子字符串中重用了第一个字符串。如何在内存中排列字符串常量是编译器的选择。

关于c++ - C/C++ : Optimization of pointers to string constants,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336895/

相关文章:

c++ - 编译时检查的字符串到整数映射是否可能?

c++ - 如何在 C++ 中使用一定数量的空格打印输出

c - 如何正确检查 off_t 值在转换为 C 中的 size_t 时不会溢出?

C - 在 if 语句条件中重构多个 OR

Java 绘制特定对象

performance - 缓存相关的性能优化技术?

c++ - 如何生成 64 位 COM 代理

c++ - 使用 Batch,如何确定您是否连接到 WiFi 网络?

c - line_c |= 064;/* 错误地设置了位 2,4 和 5 */.. Misra C 指南。这是怎么发生的?

iphone - iPhone 上 SQLite 中的临时表存储