Код: Выделить всё
#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
Код: Выделить всё
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