为什么std::wstring().caccepty()的constexpr不等于std::ws string().ca



我不确定我是太天真了还是太无知了。

但是,为什么以下内容不同呢?

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 ,该行为也是可以解释的

最新更新