使用_GLIBCXX_CXX11_ABI使用带有C++ 11/14功能的5.1之前的C++ ABI有什么影响?

Spa*_*ose 6 c++ gcc abi

手册:

在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. 我错过了其他影响吗?原子和并发功能怎么样?有什么影响?

Lea*_*elo 1

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

...要使用的 ABI 选择独立于用于编译代码的 -std 选项...这可确保 -std 不会更改 ABI,以便可以直接链接 C++03 和 C+ +11 代码在一起。

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

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

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