我不确定我是太天真了还是太无知了。
但是,为什么以下内容不同呢?
constexpr auto nInitialCapacity1 = std::wstring().capacity();
const auto nInitialCapacity2 = std::wstring().capacity();
在Visual Studio 2022/17.0.5中,上面的代码导致:
nInitialCapacity1 = 8
nInitialCapacity2 = 7
为什么constexpr
(编译时(版本的结果不等于调用的const
版本?
谢谢你的解释!
Microsoft的STL在恒定求值上下文中禁用短字符串优化,因此它会分配内存。
分配总是比二的幂多一,因此容量(不包括最后一个L' '
(总是二的幂。
在非常量评估版本中,短字符串缓冲区可以容纳8个字符,其中一个是L' '
,因此容量为7。
根据新经验和观察结果更新:
- 反汇编窗口的内容显示,const调用
to std::wstring::capacity
的结果是8 - 但是监视窗口和变量的工具提示显示7
一位同事的假设是,调试器将constexpr方法的容量称为非常量,得到不同的结果7并将其可视化。
查看反汇编窗口的一个原因是以下代码中的意外行为:
const auto nInitCap = std::wstring().capacity();
const auto nCap = str.capacity();
if (nCap != nInitCap)
std::wcout << "capacity " << nCap << "is not equal to the initial capacity " << nInitCap << std::endl;
if (nCap > nInitCap)
std::wcout << "capacity " << nCap << "is greater than the initial capacity " << nInitCap << std::endl;
调试器显示了变量:
nInitCap: 7
nCap: 7
但打印出来的代码:
容量7不等于初始容量7
对const构造的临时对象的容量调用返回8,正如在反汇编中所看到的那样,因此即使VS2022 17.0.5的调试器显示7 ,该行为也是可以解释的