gpt4 book ai didi

c++ - 类成员是否保证在内存中是连续的?

转载 作者:可可西里 更新时间:2023-11-01 18:17:27 27 4
gpt4 key购买 nike

我有一个包含许多函数指针的类,我希望在构造对象时将它们全部初始化为 NULL。为此,我计划在从第一个指针到最后一个指针的内存位置上使用 memset,但是,我不确定这是否会在 100% 的时间内工作。

是否保证如果这些函数指针在类中连续声明,那么它们的内存位置也将是连续的。我假设填充不会影响我正在尝试做的事情,因为任何填充字节也会被设置为 NULL。

示例类实现

class C
{
private:
void (*func1)();
void (*func2)();
void (*func3)();
void (*func4)();
};

最佳答案

保证它们按照声明的顺序以增加的地址出现。对于没有干预访问说明符的数据成员来说,这通常是正确的,因此如果类中有其他数据成员,那么它们可以干预的唯一方法就是其中是否有访问说明符。

我认为修改填充字节不能保证安全。我不认为可以保证实现不会在数据成员之间放置“重要的东西”,尽管我不能立即想到实现想要放在那里的任何东西。设计奇怪的准确标记 GC 的类型信息?用于测试缓冲区溢出的可识别值?

不能保证所有位为零表示一个空函数指针。

您可以使用类似的方法处理全零表示的问题:

std::fill(&func1, &func4 + 1, (void(*)(void))0);

但这仍然会留下填充的问题。你保证在数组中没有填充,但在类中没有(按照标准)。您的实现使用的 ABI 可能会指定结构布局到必要的程度,以确保您上面的类的布局与 4 个函数指针的数组相同。

另一种方法是执行以下操作:

struct function_pointers {
void (*func1)();
void (*func2)();
void (*func3)();
void (*func4)();
};

class C : private function_pointers
{
public:
C() : function_pointers() {}
};

初始化器 function_pointers() 规定(因为它没有用户声明的构造函数)function_pointers 的成员被零初始化,即使C 本身只是默认初始化的。 function_pointers 可以是数据成员而不是基类,如果您希望输入更多内容以访问 func1

请注意,C 现在在 C++03 中是非 POD。在 C++11 中,C 在此更改后保持标准布局,但如果 C 中定义了任何数据成员,则不会是标准布局,并且它不是琐碎的类。所以如果你依赖 POD/standard/trivial-ness 然后不要这样做。而是保留 C 的定义,并使用聚合初始化 (C c = {0};) 对 C 的实例进行零初始化。

关于c++ - 类成员是否保证在内存中是连续的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430848/

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