c – 班级成员是否保证在记忆中是连续的?

c – 班级成员是否保证在记忆中是连续的?,第1张

概述我有一个包含许多函数指针的类,我希望在构造对象时将它们全部初始化为NULL.为此,我计划在内存位置上使用memset,从第一个指针指向最后一个指针,但是我不确定这是否会在100%的时间内正常工作. 如果这些函数指针在类中连续声明它们的内存位置也是连续的,则可以保证.我假设填充不会影响我正在尝试做的事情,因为任何填充字节也只会设置为NULL. 示例类实现 class C{private: 我有一个包含许多函数指针的类,我希望在构造对象时将它们全部初始化为NulL.为此,我计划在内存位置上使用memset,从第一个指针指向最后一个指针,但是我不确定这是否会在100%的时间内正常工作.

如果这些函数指针在类中连续声明它们的内存位置也是连续的,则可以保证.我假设填充不会影响我正在尝试做的事情,因为任何填充字节也只会设置为NulL.

示例类实现

class C{private:    voID (*func1)();    voID (*func2)();    voID (*func3)();    voID (*func4)();};
解决方法 保证它们在声明的顺序中以增加的地址出现.对于没有干预访问说明符的数据成员来说,这是正确的,因此如果类中有其他数据成员,那么他们可以干预的唯一方法是在那里有访问说明符.

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

不能保证all-bits-zero表示空函数指针.

您可以使用以下方法处理all-bits-zero表示的问题:

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()指示(因为它没有用户声明的构造函数),即使C本身的实例只是默认初始化,function_pointers的成员也是零初始化的. function_pointers可以是数据成员而不是基类,如果你更喜欢输入更多来访问func1等.

请注意,C在C 03中现在是非POD.在C 11 C中,在此更改后仍然是标准布局,但如果在C中定义了任何数据成员,则不会是标准布局,并且它不是一个简单的类.所以,如果你依赖POD /标准/琐碎,那就不要这样做了.而是保持C的定义,并使用聚合初始化(C c = {0};)来初始化C的实例.

总结

以上是内存溢出为你收集整理的c – 班级成员是否保证在记忆中是连续的?全部内容,希望文章能够帮你解决c – 班级成员是否保证在记忆中是连续的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243114.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存