使用_GLIBCXX_CXX11_ABI将5.1之前的C ++ ABI与C ++ 11/14功能一起使用会产生什么影响?

时间:2015-12-18 08:18:23

标签: c++ gcc abi

来自the manual:

  

在GCC 5.1版本中,libstdc ++引入了一个新的库ABI,其中包括std :: string和std :: list的新实现。这些更改对于符合2011 C ++标准是必要的,该标准禁止写入时写入字符串并要求列表跟踪其大小。

可以使用_GLIBCXX_USE_CXX11_ABI宏来控制库标题使用旧的或新的ABI,而不管是哪个" -std"正在使用。

我想知道使用这个"兼容性ABI"将会?我猜小串操作的运行时性能会受到影响(我假设是负面的),并且列表大小访问从O(1)(C11 ABI)到O(N)(兼容性ABI)。

  1. 我的猜测是否正确,任何人都可以详细说明吗?
  2. 我错过了其他影响吗?原子和并发功能怎么样?有什么影响?

1 个答案:

答案 0 :(得分:1)

您的第一个问题实际上是由手册本身回答的:

  

...要使用的ABI的选择与以前使用的-std选项无关   编译你的代码...这确保-std不会改变ABI,所以它是   直接将C ++ 03和C ++ 11代码链接在一起。

关于第二个问题,我担心很难概括影响因为它取决于你的代码如何使用标准库。它复制了很多字符串吗?查询列表大小的频率如何?代码是多线程的吗?

尽管在C ++ 11的标准中引入了原子和并发,但我猜测stdlib ++ copy-on-write机制无论如何已经使用了它的变体。这些实现通常是线程安全的。

也许您没有直接提及的一件事是对依赖于这些行为的其他标准组件的影响,例如list::splice