我发现,对齐的空结构的大小严格等于其对齐方式(live example):
#include <iostream>
#include <utility>
#include <cstdlib>
template< std::size_t i >
struct alignas(1 << i) aligned_storage
{
};
template< std::size_t ...I >
constexpr
void
test(std::index_sequence< I... >)
{
static_assert(((sizeof(aligned_storage< I >) == (1 << I)) && ...));
}
int
main()
{
test(std::make_index_sequence< 29 >{});
return EXIT_SUCCESS;
}
形成良好code(尤其是展示位置new
)(?):
#include <iostream>
#include <algorithm>
#include <cstdlib>
template< std::size_t argument, std::size_t base = 2, bool = (argument < base) >
constexpr std::size_t log = 1 + log< (argument / base), base >;
template< std::size_t argument, std::size_t base >
constexpr std::size_t log< argument, base, true > = 0;
template< typename ...types >
struct alignas(2 << std::max({log< sizeof(types) - 1 >...})) aligned_storage
{
};
struct A
{
int j;
A(int i) : j(i) { std::cout << j << ' ' << __PRETTY_FUNCTION__ << std::endl; }
~A() { std::cout << j << ' ' << __PRETTY_FUNCTION__ << std::endl; }
};
struct B
{
short j;
B(short i) : j(i) { std::cout << j << ' ' << __PRETTY_FUNCTION__ << std::endl; }
~B() { std::cout << j << ' ' << __PRETTY_FUNCTION__ << std::endl; }
};
int
main()
{
aligned_storage< A, B > storage;
auto a = ::new (&storage) A{1};
a->~A();
auto b = ::new (&storage) B{2};
b->~B();
return EXIT_SUCCESS;
}
C ++ 中允许使用上述struct
代替std::aligned_storage_t
吗?
答案 0 :(得分:1)
http://en.cppreference.com/w/cpp/language/sizeof
当应用于类类型时,结果是对象的大小 该类加上放置此类对象所需的任何其他填充 在数组中。
当应用于空类类型时,始终返回1.
标准要求sizeof(type[N])==sizeof(type)*N
的等效解释始终为true
。这将导致sizeof
的结果始终是实际内存表示大小和对齐中的较大者。