在C++实现中,代码通常不会(以任何形式)存储在类实例中。代码段不在与对象等相同的存储空间中。这意味着成员函数不会“存储”在类实例中。
但是当a question was asked谈到这一点时,我想知道:该标准在多大程度上禁止成员函数存储在它们的封装类中,以至于实例化该类会复制这些函数?从理论上讲,我可以这样做一个实现吗?它甚至可以完全遵守通用的ABI吗?
发布于 2014-01-24 03:23:03
如果在C++中,代码是一级值,那么成员函数的代码将只是一个const static
类成员,您不会期望在实例中找到它,就像在任何其他静态数据成员中一样。(§9.4.2:“静态数据成员不是类的子对象的一部分。”)
然而,代码不被认为是一个值,而且您甚至不能构造一个指向成员函数的指针(尽管您可以构造一个“指向成员的指针”,但这并不是一个真正的指针,因为它在没有引用实例的情况下是不可用的)。这使得成员函数代码不同于静态数据成员和非成员函数,这两者都允许创建独立的指针,而且具有(或多或少)排除复制的相等保证。
类实例确实包含对虚拟成员函数的引用(在大多数实现中是间接的;指针实际上是指向静态vtable的),在创建新实例时必须复制该引用。对引用的大小没有要求,所以在理论上(据我所知),没有什么可以阻止实现避免间接寻址,并为类的每个实例重新存储整个代码。
但标准布局类型有一个例外,它是没有虚拟成员函数的类的子集,在§9.12/18中表示,这要求具有相同初始成员的两个标准布局类型具有相同的初始成员布局。回想起标准布局对象必须简单地使用memcpy复制(§3.9/3),在内存中必须是连续的(§1.8/5),并且必须按顺序包括它们的成员(§9.12/13),这个要求使得在任何标准布局对象中实际上不可能包括特定于类的静态数据,这将包括成员函数的代码。
因此,我得出结论,至少对于标准布局对象,C++标准确实禁止在对象表示中存储静态数据,包括成员函数的代码。
https://stackoverflow.com/questions/21316610
复制相似问题