gpt4 book ai didi

c++ - sizeof 对齐的空结构

转载 作者:行者123 更新时间:2023-11-30 05:42:26 24 4
gpt4 key购买 nike

我发现,对齐的空结构的大小严格等于其对齐方式(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 (尤其是展示位置)():

#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

最佳答案

http://en.cppreference.com/w/cpp/language/sizeof

When applied to a class type, the result is the size of an object ofthat class plus any additional padding required to place such objectin an array.

When applied to an empty class type, always returns 1.

等效的解释是 sizeof(type[N])==sizeof(type)*N 标准要求它始终为 true。这将导致 sizeof 的结果始终是实际内存表示大小和对齐中较大的一个。

关于c++ - sizeof 对齐的空结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com