Почему выдвижение 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

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