从 C++ 标准:
标准布局类是这样的类:
— 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
— 没有虚函数 (10.3) 和虚基类 (10.1),
— 对所有非静态数据成员具有相同的访问控制(第 11 条), — 没有非标准布局的基类,
— 要么在最派生类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有具有非静态数据成员的基类,并且
— 没有与第一个非静态数据成员相同类型的基类
宏 offsetof(type, member-designator) 在本国际标准中接受一组受限制的类型参数。如果 type 不是标准布局类(第 9 条),则结果未定义
offsetof
考虑到这些语句,对于依赖于模板参数的成员是否有任何安全的使用方式?如果没有,我如何获得模板类中成员的偏移量?使用以下内容可能不安全:
//MS Visual Studio 2013 definition
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
在非标准布局类上?
在根据标准不安全的样本之后:
#include <cstddef>
#include <iostream>
template<typename T>
struct Test
{
int a;
T b;
};
struct NonStdLayout
{
virtual void f(){};
};
int main()
{
std::cout << offsetof(Test<int>, b) << std::endl;
std::cout << offsetof(Test<NonStdLayout>, b) << std::endl;
return 0;
}