编译器如何管理相同的字符?
How the compiler manages the same char?
我想知道编译器(我使用的是 VS 2015)是否在检查代码时发现相同字符时也进行了优化?
示例:
wstrFile.find_last_of(L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
wstrFile.find_last_of(L"aefgh");
"aefgh"(使用两次)在程序启动时只在某处存储一次?
否则,将它们存储在变量中以获得(一点点)space有用吗? (在所有情况下,我都会进一步使用这个变量)
一种实现允许L"abcdef"
和L"abcdef"
具有相同的地址,但是不可能使L"cd"
指向该文字的中间字符,因为文字必须以 NULL 字符结尾,并且原始字符串中该位置不存在 NULL 字符。
确实存在内存非常紧张的用例,但我想说的是,总的来说,您需要关心这个的可能性很小 none。
不,从来没有。
默认和通常的行为是,如果您定义任何类型的常量对象(字符串、数组等),那么编译器将至少在某处分配该数量的存储空间,并按照定义设置内容。存储通常会在某种边界上分配,因此经常会浪费几个字节作为填充。
有些编译器可能会选择性地分配单个字符串或其他常量对象,即使您多次声明它,但仅限于完整对象级别,永远不会(如您所问)字符串中的单个字符。
大多数优化旨在使程序运行 更快,但可能会以更多内存为代价。节省几个字节存储空间的策略没有有价值的回报,也没有被采纳。
我想知道编译器(我使用的是 VS 2015)是否在检查代码时发现相同字符时也进行了优化?
示例:
wstrFile.find_last_of(L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
wstrFile.find_last_of(L"aefgh");
"aefgh"(使用两次)在程序启动时只在某处存储一次?
否则,将它们存储在变量中以获得(一点点)space有用吗? (在所有情况下,我都会进一步使用这个变量)
一种实现允许L"abcdef"
和L"abcdef"
具有相同的地址,但是不可能使L"cd"
指向该文字的中间字符,因为文字必须以 NULL 字符结尾,并且原始字符串中该位置不存在 NULL 字符。
确实存在内存非常紧张的用例,但我想说的是,总的来说,您需要关心这个的可能性很小 none。
不,从来没有。
默认和通常的行为是,如果您定义任何类型的常量对象(字符串、数组等),那么编译器将至少在某处分配该数量的存储空间,并按照定义设置内容。存储通常会在某种边界上分配,因此经常会浪费几个字节作为填充。
有些编译器可能会选择性地分配单个字符串或其他常量对象,即使您多次声明它,但仅限于完整对象级别,永远不会(如您所问)字符串中的单个字符。
大多数优化旨在使程序运行 更快,但可能会以更多内存为代价。节省几个字节存储空间的策略没有有价值的回报,也没有被采纳。