Каковы последствия использования _GLIBCXX_CXX11_ABI для использования C++ ABI до версии 5.1 с функциями C++ 11/14?

Из руководства:

В выпуске GCC 5.1 libstdc++ представил новую библиотеку ABI, которая включает новые реализации std::string и std::list. Эти изменения были необходимы для соответствия стандарту C++ 2011 года, который запрещает копирование строк при записи и требует, чтобы списки отслеживали их размер.

Можно использовать макрос _GLIBCXX_USE_CXX11_ABI, чтобы контролировать, какой из заголовков библиотеки использует старый или новый ABI, независимо от того, какой «-std» используется.

Я хотел бы знать, каковы будут последствия использования этого «совместимого ABI»? Я предполагаю, что это повлияет на производительность операций с небольшими строками во время выполнения (я предполагаю, что отрицательно), и что доступ к размеру списка изменится с O (1) (C11 ABI) до O (N) (совместимость ABI).

  1. Верны ли мои предположения и может ли кто-нибудь уточнить?
  2. Есть ли другие последствия, которые я пропустил? Как насчет атомарности и параллелизма? Какое-то влияние?

person Spacemoose    schedule 18.12.2015    source источник
comment
Когда вы говорите C, вы имеете в виду O (1)?   -  person John Zwinck    schedule 18.12.2015
comment
Полагаю, что так. Я имею в виду постоянное время.   -  person Spacemoose    schedule 18.12.2015
comment
Я думаю, что проще всего было бы просмотреть заголовки, не так много случаев _GLIBCXX_USE_CXX11_ABI.   -  person Marc Glisse    schedule 18.12.2015
comment
отредактировано .. думаю, я предполагаю, что обозначения из моих курсов исчисления застряли больше, чем мой курс алгоритмов   -  person Spacemoose    schedule 18.12.2015
comment
@Marc Glisse - это хорошее предложение. Я все еще могу упустить важное значение, вызванное цепочкой зависимостей, поэтому я буду рад, если кто-то с большим опытом вмешается.   -  person Spacemoose    schedule 18.12.2015
comment
Хотя я хотел бы увидеть полный список, я думаю, что это слишком широкий вопрос для SO. Я не думаю (не проверял), что это влияет на атомарность или параллелизм. Во-первых, это не упоминается в руководстве, а во-вторых, в стандарте до С++ 11 таких вещей не было, и я бы не ожидал, что они сохранят совместимость с любыми экспериментальными, нестандартными версиями С++ 0x этих функций. .   -  person MikeMB    schedule 18.12.2015
comment
Я не согласен с чрезмерно широкой характеристикой (очевидно :)). Но я думаю, что ваши замечания относительно параллелизма уместны. Однако, если я объединим ваши наблюдения с тем фактом, что я могу использовать флаг -std независимо от макроса ABI, это означает, что макрос может изменить поведение указанной функции. То, что указанная функциональность была экспериментальной до 11, может означать слабое обязательство документировать такое изменение. Отсюда вопрос.   -  person Spacemoose    schedule 18.12.2015


Ответы (1)


На ваш первый вопрос фактически отвечает само руководство:

... выбор используемого ABI не зависит от параметра -std, используемого для компиляции вашего кода... Это гарантирует, что -std не изменит ABI, так что связать C++03 и C+ будет просто. Код +11 вместе.

Что касается второго вопроса, я боюсь, что трудно обобщить влияние, потому что это зависит от того, как ваш код использует стандартную библиотеку. Много ли он копирует строки? Как часто запрашивается размер списка? Является ли код многопоточным?

Хотя атомарность и параллелизм были введены в стандарте С++ 11, я предполагаю, что механизм копирования при записи stdlib++ уже все равно использовал его вариант. Эти реализации обычно потокобезопасны.

Возможно, вы прямо не упомянули о влиянии на другие стандартные компоненты, которые зависят от этого поведения, например list::splice.

person Leandro T. C. Melo    schedule 31.12.2015