gpt4 book ai didi

c++ - 对模板类使用 offsetof

转载 作者:太空狗 更新时间:2023-10-29 21:43:56 25 4
gpt4 key购买 nike

来自 C++ 标准:

A standard-layout class is a class that:

— has no non-static data members of type non-standard-layout class (orarray of such types) or reference,

— has no virtual functions (10.3) and no virtual base classes (10.1),

— has the same access control (Clause 11) for all non-static data members,— has no non-standard-layout base classes,

— either has no non-static data members in the most derived class andat most one base class with non-static data members, or has no baseclasses with non-static data members, and

— has no base classes of the same type as the first non-static datamember

The macro offsetof(type, member-designator) accepts a restricted setof type arguments in this International Standard. If type is not astandard-layout class (Clause 9), the results are undefined

考虑到这些语句,对于依赖于模板参数的成员,是否有任何安全的方法来使用 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;
}

最佳答案

offsetof 不能用于非标准布局类,因为它们在内存中的布局是未知的。例如,该标准没有指定虚拟成员函数是如何实现的。一种常见的方法是添加一个指向 vtable 的指针作为类的第一个数据成员,但这不是唯一的方法。

关于您对 offsetof 的定义:不能保证空指针通过 reinterpret_cast(或通过 C -样式转换),也没有为转换为整数的指针的其他值指定任何语义。

因此,如果您知道您的定义在您的编译器为您的平台使用的底层寻址方案中有意义,它就可以工作。但这是您必须注意的如果

关于c++ - 对模板类使用 offsetof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577845/

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