编译器如何管理相同的字符

How the compiler manages the same char?

本文关键字:字符 管理 何管理 编译器      更新时间:2023-10-16

我想知道编译器(我使用的是VS 2015)是否也会优化,如果它在检查代码时找到相同的字符?

例:

wstrFile.find_last_of(L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
wstrFile.find_last_of(L"aefgh");

"aefgh"(使用两次)仅在程序启动时在某个地方存储一次?

否则,将它们存储在变量中以获得(一点点)空间是否有用?(在所有情况下,我将进一步使用此变量)

允许实现使L"abcdef"L"abcdef"具有相同的地址,但不可能使L"cd"指向该文本的中间字符,因为文本必须以 NULL 字符结尾,并且在原始字符串中的该位置不存在 NULL 字符。

内存非常紧张的用例确实存在,但我想说的是,总的来说,你需要关心这个问题的可能性微乎其微。

不,永远不会。

默认和通常的行为是,如果您定义任何类型的常量对象(字符串、数组等),那么编译器将至少在某处分配该数量的存储,并按照定义设置内容。存储通常会在某种边界上分配,因此通常会浪费几个字节作为填充。

某些编译器可以选择分配单个字符串或其他常量对象,即使您多次声明它,但仅在完整对象级别,绝不(如您所要求的那样)字符串中的单个字符。

大多数优化旨在使程序运行得更快,也许是以牺牲更多内存为代价的。节省几字节存储的策略没有值得的回报,也没有被追求。