为什么 std::wstring().capacity() 的 constexpr 不等于 std::wstring().capacity()?
Why is constexpr of std::wstring().capacity() not equal to std::wstring().capacity()?
我不确定我是太天真了还是太无知了。
但为什么以下内容不同?
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 disables short string optimisation in constant evaluated contexts,因此它分配内存。
分配总是大于 2 的幂,因此容量(不包括最后一个 L'[=10=]'
)总是 2 的幂。
在non-constant-evaluated版本中,短字符串缓冲区可以容纳8个字符,其中一个是L'[=10=]'
,所以容量是7。
根据新的经验和观察更新:
- 反汇编的内容window显示,const-call
to std::wstring::capacity
的结果是8!
- 但是手表 window 和变量的工具提示显示 7.
同事的假设是,调试器调用constexpr方法capacitynon-const,得到7的不同结果并可视化。
调查反汇编的一个原因 window 是以下代码中的意外行为:
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
但是打印出来的代码:
capacity 7 is not equal to the initial capacity 7
对const-constructed临时对象returns8的容量调用,正如在反汇编中看到的那样,所以行为是可以解释的,即使VS2022 17.0.5的调试器显示7
我不确定我是太天真了还是太无知了。
但为什么以下内容不同?
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 disables short string optimisation in constant evaluated contexts,因此它分配内存。
分配总是大于 2 的幂,因此容量(不包括最后一个 L'[=10=]'
)总是 2 的幂。
在non-constant-evaluated版本中,短字符串缓冲区可以容纳8个字符,其中一个是L'[=10=]'
,所以容量是7。
根据新的经验和观察更新:
- 反汇编的内容window显示,const-call
to std::wstring::capacity
的结果是8! - 但是手表 window 和变量的工具提示显示 7.
同事的假设是,调试器调用constexpr方法capacitynon-const,得到7的不同结果并可视化。
调查反汇编的一个原因 window 是以下代码中的意外行为:
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
但是打印出来的代码:
capacity 7 is not equal to the initial capacity 7
对const-constructed临时对象returns8的容量调用,正如在反汇编中看到的那样,所以行为是可以解释的,即使VS2022 17.0.5的调试器显示7