C/C++:优化指向字符串常量的指针

C/C++: Optimization of pointers to string constants(C/C++:优化指向字符串常量的指针)
本文介绍了C/C++:优化指向字符串常量的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

看看这段代码:

#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),指针都指向同一个位置.

This was on the g++ compiler running under Cygwin. The pointers all point to the same location even with no optimization turned on (-O0).

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

Does the compiler always optimize so much that it searches all the string constants to see if they are equal? Can this behaviour be relied on?

推荐答案

这是一种极其简单的优化,可能非常简单,以至于大多数编译器编写者甚至根本不认为它是一种优化.毕竟,将优化标志设置为最低级别并不意味着完全天真".

It's an extremely easy optimization, probably so much so that most compiler writers don't even consider it much of an optimization at all. Setting the optimization flag to the lowest level doesn't mean "Be completely naive," after all.

编译器在合并重复字符串文字方面的积极性会有所不同.他们可能会将自己限制在一个子程序中——将这四个声明放在不同的函数中而不是一个函数中,你可能会看到不同的结果.其他人可能会做一个完整的编译单元.其他人可能会依赖链接器在多个编译单元之间进行进一步的合并.

Compilers will vary in how aggressive they are at merging duplicate string literals. They might limit themselves to a single subroutine — put those four declarations in different functions instead of a single function, and you might see different results. Others might do an entire compilation unit. Others might rely on the linker to do further merging among multiple compilation units.

你不能依赖这种行为,除非你的特定编译器的文档说你可以.语言本身在这方面没有要求.我对在我自己的代码中依赖它持谨慎态度,即使可移植性不是问题,因为即使在单个供应商编译器的不同版本之间,行为也可能会发生变化.

You can't rely on this behavior, unless your particular compiler's documentation says you can. The language itself makes no demands in this regard. I'd be wary about relying on it in my own code, even if portability weren't a concern, because behavior is liable to change even between different versions of a single vendor's compiler.

这篇关于C/C++:优化指向字符串常量的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

OpenGL transforming objects with multiple rotations of Different axis(OpenGL 变换不同轴多次旋转的对象)
GLFW first responder error(GLFW 第一响应者错误)
SOIL not linking correctly(SOIL 连接不正确)
Core profile vs version string? Only getting GLSL 1.3/OGL 3.0 in mesa 10.0.1(核心配置文件与版本字符串?在 mesa 10.0.1 中只获得 GLSL 1.3/OGL 3.0)
What is the range of OpenGL texture ID?(OpenGL 纹理 ID 的范围是多少?)
How taxing are OpenGL glDrawElements() calls compared to basic logic code?(与基本逻辑代码相比,OpenGL glDrawElements() 调用的繁重程度如何?)