考虑以下C ++程序:
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> v(2, std::string(24,0));
for (auto& s : v) {
std::cout << "Address: " << (void*)s.data() << std::endl;
}
}
我希望向量中的每个字符串都指向不同的内存区域,但是在使用gcc 6.3.0和8.2.1进行编译时-D_GLIBCXX_USE_CXX11_ABI=0
,它们显示相同的地址。(在不带标志的情况下进行编译时,它们将显示不同的地址)。这是为什么?
-D_GLIBCXX_USE_CXX11_ABI=0
(1)与此std::string
将其允许预C ++ 11的用途COW策略。
C opy O n W rite是一种优化策略。使用COW,当std::strings
使用相同的值构造多个对象时,只会创建一个基础字符串数组,并且所有对象都将指向该字符串数组。这就是您在代码中观察到的。当写入一个std::string
对象时,将创建该对象唯一的字符串数组的副本,然后对其进行修改。
从C ++ 11开始,此策略是非法的(2),现在大多数实现都使用SSO(短字符串优化)优化std::string
代替。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句