Почему выдвижение Allocator члена данных изменяет сгенерированную сборку?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему выдвижение Allocator члена данных изменяет сгенерированную сборку?

Сообщение Anonymous »

Следующий фрагмент кода C ++: < /p>

Код: Выделить всё

#include 
#include 

template 
struct Storage
{
alignas(void*) std::byte _data[sizeof(StoredType)];

using AllocatorType = std::allocator;
using AllocatorTraits = std::allocator_traits;

[[no_unique_address]] AllocatorType _alloc;

Storage(StoredType arg) noexcept {
AllocatorTraits::construct(
_alloc, static_cast(static_cast(&_data[0])), arg);
}

StoredType& access() noexcept {
return *static_cast(static_cast(&_data[0]));
}
};

using type = long;

auto bar(Storage n) noexcept {
type m = n.access();
return m * 2;
}
< /code>
генерирует следующую сборку (на -o3): < /p>
bar(Storage):
movq    (%rdi), %rax
addq    %rax, %rax
ret
Тем не менее, если кто-то должен был удалить Allocatortype _alloc элемент данных, и вместо этого построить локально:

Код: Выделить всё

    Storage(StoredType arg) noexcept {
AllocatorType alloc{};

AllocatorTraits::construct(
alloc, static_cast(static_cast(&_data[0])), arg);
}
< /code>
будет сгенерирована другая сборка: < /p>
bar(Storage):
leaq    (%rdi,%rdi), %rax
ret
два вопроса:
  • Почему это происходит?
  • Значит ли это, что сделать выделение, член члена данных, снижает производительность?
Вот ссылка.

Подробнее здесь: https://stackoverflow.com/questions/794 ... d-assembly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»