2

我正在阅读 C++ 的参考资料,在那里我发现为了确保定义为 const 的对象的 ROMability:
1.类或结构必须没有用户定义的构造函数
2.不能有基类或成员对象用户定义的构造函数或析构函数。
我将此参考按位常量而不是可变常量。
在我看来,第一个成立是因为构造函数或析构函数修改了 const 数据成员。因此,我们避免使用用户定义的构造函数或析构函数。
但我无法很好地解释第二点。

4

3 回答 3

3

正如您所说,第一点是必要的,因为具有用户定义构造函数的对象是在运行时初始化的(在运行前的动态初始化阶段main,如果它们具有静态生命周期),因此不能以只读方式放置内存,因为该初始化必须修改对象的内存。

第二点从第一点开始——如果(非静态)成员或基本子对象具有用户定义的构造函数,则该构造函数也必须用于在运行时初始化成员或子对象。因此,至少有一部分对象不能存储在只读存储器中;所以物体本身不可能。

于 2013-02-28T15:33:27.827 回答
3

构造函数/析构函数会修改对象,这不利于将其存储在 ROM 中。

如果类包含对象或继承了构造函数,那仍然是必须运行来构造对象的代码(成员与其父对象一起存储)。这在编译时(组装 ROM 对象时)是不可能的。

于 2013-02-28T15:30:59.463 回答
3

这看起来像PODC++03 中的定义。 POD表示普通的旧数据。一些编译器和平台const可以放置一个全局实例。ROM

C++11 添加了可以映射到ROMable 的新语言特性。 constexpr构造函数和标准布局类型,在它们之间,可能是一些编译器可以放入的合理限制ROM。但这将取决于编译器对ROMing 数据的支持。

于 2013-02-28T15:55:52.477 回答