позволяет более эффективно размещать структуры, иногда помещая элементы в заполнение хвоста предыдущих членов. Нам всем нравится экономить оперативную память и иметь более эффективные кеш-структуры. Так почему бы не использовать его везде и всегда?
Ссылаясь на стандарт C++ и/или ABI Itanium C++, какие существуют причины избегать использования [[no_unique_address]] на большинстве или на всех участниках?
Например:
Есть ли при этом проблемы с безопасностью, например, опасения по поводу перезаписи объекта в хвостовом отступе при использовании оператор=? Этот ответ подразумевает, что, возможно, да, но неясно, является ли это ошибкой в реализации std::copy, а также я не могу воспроизвести ее с помощью современного clang.
Я не нашел в стандарте ничего, что говорило бы, что оператор = может вызвать здесь проблему. Кроме того, похоже, что любая проблема с [[no_unique_address]] также применима к базовым классам, в которые помещаются члены подкласса с заполнением хвоста.
Существуют ли проблемы с эффективностью, например, требуется ли больше кода для загрузки или сохранения значений? Учитывая, что выравнивание по-прежнему правильное, я не понимаю, почему это так.
Я пришел к этому вопросу, размышляя, почему std::variant в libc++ не использует [[no_unique_address]] для своего состояния, то есть я не могу использовать его в структуре, которая требует быть эффективно вложен в другой и может добиться большего успеха с объединение и тег с открытым кодом. Мне неясно, можно ли безопасно использовать [[no_unique_address]] в std::variant, если нас не волнует изменение ABI. Но меня интересует более широкий вопрос: каковы недостатки в целом.
[code][[no_unique_address]][/code] позволяет более эффективно размещать структуры, иногда помещая элементы в заполнение хвоста предыдущих членов. Нам всем нравится экономить оперативную память и иметь более эффективные кеш-структуры. Так почему бы не использовать его везде и всегда? Ссылаясь на стандарт C++ и/или ABI Itanium C++, какие существуют причины избегать использования [[no_unique_address]] на большинстве или на всех участниках? Например: [list] [*]Есть ли при этом проблемы с безопасностью, например, опасения по поводу перезаписи объекта в хвостовом отступе при использовании оператор=? Этот ответ подразумевает, что, возможно, да, но неясно, является ли это ошибкой в реализации std::copy, а также я не могу воспроизвести ее с помощью современного clang. Я не нашел в стандарте ничего, что говорило бы, что оператор = может вызвать здесь проблему. Кроме того, похоже, что любая проблема с [[no_unique_address]] также применима к базовым классам, в которые помещаются члены подкласса с заполнением хвоста.
[*] Существуют ли проблемы с эффективностью, например, требуется ли больше кода для загрузки или сохранения значений? Учитывая, что выравнивание по-прежнему правильное, я не понимаю, почему это так.
[/list]
Я пришел к этому вопросу, размышляя, почему std::variant в libc++ не использует [[no_unique_address]] для своего состояния, то есть я не могу использовать его в структуре, которая требует быть эффективно вложен в другой и может добиться большего успеха с объединение и тег с открытым кодом. Мне неясно, можно ли безопасно использовать [[no_unique_address]] в std::variant, если нас не волнует изменение ABI. Но меня интересует более широкий вопрос: каковы недостатки в целом.