我有一个包含许多函数指针的类,我想在构造对象时将它们全部初始化为NULL.为此,我计划在内存位置上使用memset,从第一个指针指向最后一个指针,但是我不确定这是否会在100%的时间内起作用.
如果这些函数指针在类中连续声明它们的内存位置也是连续的,那么它是否可以保证.我假设填充不会影响我正在尝试做的事情,因为任何填充字节也只会设置为NULL.
示例类实现
class C
{
private:
void (*func1)();
void (*func2)();
void (*func3)();
void (*func4)();
};
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 10
保证它们在声明的顺序中以增加的地址出现.对于没有干预访问说明符的数据成员来说,这是正确的,因此如果类中有其他数据成员,那么他们可以干预的唯一方法是在那里有访问说明符.
我不认为修改填充字节是安全的.我不认为保证实现不会在数据成员之间放置"重要的东西",尽管我不能立即想到实现想要放在那里的任何东西.为奇怪设计的精确标记GC输入信息?可识别的值来测试缓冲区溢出?
不能保证all-bits-zero表示空函数指针.
您可以使用以下方法处理all-bits-zero表示的问题:
std::fill(&func1, &func4 + 1, (void(*)(void))0);
Run Code Online (Sandbox Code Playgroud)
但这仍然会留下填充问题.您可以保证数组中没有填充,但在类中没有(按标准).您的实现使用的ABI可能指定结构布局到必要的程度,以确保您的上面的类与4个函数指针的数组相同.
另一种方法是执行以下操作:
struct function_pointers {
void (*func1)();
void (*func2)();
void (*func3)();
void (*func4)();
};
class C : private function_pointers
{
public:
C() : function_pointers() {}
};
Run Code Online (Sandbox Code Playgroud)
初始化程序function_pointers()指示(因为它没有用户声明的构造函数),function_pointers即使其C自身的实例仅默认初始化,也会对其成员进行零初始化.function_pointers如果您更喜欢键入更多内容来访问func1等,则可以是数据成员而不是基类.
请注意,C现在C++ 03中的非POD.在C++ 11中,C在此更改之后仍然是标准布局,但如果定义了任何数据成员C,则不会是标准布局,并且它不是一个简单的类.所以,如果你依赖POD /标准/琐碎,那就不要这样做了.而是保持C原样的定义并使用aggregate initialization(C c = {0};)来零初始化C的实例.
| 归档时间: |
|
| 查看次数: |
2116 次 |
| 最近记录: |