Kal*_*cic 3 c++ struct padding static-assert
有没有一种方法可以编写一个编译时断言来检查某种类型是否有填充?
例如:
struct This_Should_Succeed
{
int a;
int b;
int c;
};
struct This_Should_Fail
{
int a;
char b;
// because there are 3 bytes of padding here
int c;
};
Run Code Online (Sandbox Code Playgroud)
从C ++ 17开始,您可能可以使用std::has_unique_object_representations。
#include <type_traits>
static_assert(std::has_unique_object_representations_v<This_Should_Succeed>); // succeeds
static_assert(std::has_unique_object_representations_v<This_Should_Fail>); // fails
Run Code Online (Sandbox Code Playgroud)
虽然,这可能无法完全满足您的要求。检查链接的cppreference页面以获取详细信息。
编辑:检查Kerndog73的答案。
有没有一种方法可以编写一个编译时断言来检查某种类型是否有填充?
是。
您可以将所有成员的sizeof相加,然后将其与类本身的大小进行比较:
static_assert(sizeof(This_Should_Succeed) == sizeof(This_Should_Succeed::a)
+ sizeof(This_Should_Succeed::b)
+ sizeof(This_Should_Succeed::c));
static_assert(sizeof(This_Should_Fail) != sizeof(This_Should_Fail::a)
+ sizeof(This_Should_Fail::b)
+ sizeof(This_Should_Fail::c));
Run Code Online (Sandbox Code Playgroud)
不幸的是,这需要显式命名成员的总和。自动解决方案需要(编译时)反射。不幸的是,C ++语言还没有这种功能。如果幸运的话,也许在C ++ 23中。目前,有一些基于将类定义包装在宏中的解决方案。
不可移植的解决方案可能是使用-WpaddedGCC提供的选项,该选项承诺会在结构包含任何填充的情况下发出警告。可以结合使用#pragma GCC diagnostic push它,仅对选定的结构执行此操作。
我正在检查的类型,类型是模板输入。
一种可移植但不完全令人满意的方法可能是使用模板用户可以使用的自定义特征来自愿保证该类型不包含填充,从而使您能够利用这些知识。
用户将不得不依赖基于明确或基于预处理器的断言,即他们的诺言成立。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |