在 C++ 实现中,通常代码不存储(以任何形式)在类实例内。代码段与对象等不在同一内存空间。这意味着成员函数不会“存储”在类实例内部。
但当有人问了一个问题 https://stackoverflow.com/q/21316374/560648对此,我想知道:该标准在多大程度上(如果有的话)prohibit成员函数存储在其封装类中,在实例化该类时会复制这些函数吗?从理论上讲,我可以以这种方式实现吗?它甚至可以远程遵守常见的 ABI 吗?
如果在 C++ 中,代码是一等值,那么成员函数的代码将只是一个const static
类成员,并且您不会比任何其他静态数据成员更期望在实例中找到它。 (第 9.4.2 节:“静态数据成员不是类的子对象的一部分。”)
但是,代码不被视为值,而且您甚至不能构造指向成员函数的指针(尽管您可以构造“指向成员的指针”,但这并不是真正的指针,因为如果没有对实例的引用,它就无法使用) )。这使得成员函数代码不同于静态数据成员和非成员函数,两者都允许创建独立指针,并且还具有相等性保证(或多或少)防止复制。
类实例确实包含对virtual成员函数(在大多数实现中是间接的;指针实际上指向静态虚函数表),在创建新实例时必须复制该成员函数。对引用的大小没有要求,因此理论上(据我所知)没有什么可以阻止实现避免间接寻址并为类的每个实例重新存储整个代码。
但标准布局类型有一个例外,它是没有虚拟成员函数的类的子集,如第 9.12/18 节中所示,它要求两个具有相同初始成员的标准布局类型具有相同的初始成员布局。回想一下,标准布局对象必须可以使用 memcpy 进行简单复制(第 3.9/3 节),必须在内存中连续(第 1.8/5 节),并且必须按顺序包含其成员(第 9.12/13 节),这一要求使其有效不可能在任何标准布局对象中包含特定于类的静态数据,其中将包含成员函数的代码。
因此我得出的结论是,至少对于标准布局对象,C++ 标准确实禁止在对象表示中存储静态数据,包括成员函数的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)