使用_GLIBCXX_CXX11_ABI将5.1版以前的C++ABI与C++11/14功能一起使用有什么意义

What are the Implications of using _GLIBCXX_CXX11_ABI to use pre-5.1 C++ ABI with C++ 11/14 features?

本文关键字:一起 功能 什么 C++11 C++ABI ABI CXX11 GLIBCXX 1版 使用      更新时间:2023-10-16

来自手册:

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

可以使用_GLIBCXX_use_CXX11_ABI宏来控制库头使用旧ABI还是新ABI,与使用的"-std"无关。

我想知道使用这个"兼容性ABI"的含义是什么?我想小字符串操作的运行时性能会受到影响(我认为是负面的),并且列表大小的访问从O(1)(C11 ABI)到O(N)(兼容性ABI)。

  1. 我的猜测正确吗?有人能详细说明吗
  2. 我是否遗漏了其他含义?原子和并发特性呢?有影响吗

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

要使用的ABI的选择与用于编译你的代码。。。这确保了-std不会更改ABI,因此将C++03和C++11代码直接链接在一起。

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

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

也许有一件事你没有直接提到,那就是对其他依赖于这些行为的std组件的影响,比如list::splice