私人/保护/公众如何影响ABI
How private/protected/public affect the ABI?
我想要的是某些类成员有时是private
,而其他类Times public
。某些模块应该可以访问这些成员,而其他模块则无法访问。
成像此类:
class Foo {
public:
...
private:
...
protected:
...
internal:
int x;
};
在模块X中,internal
定义为:
#define internal public
,在模块中,它被定义为:
#define internal private
因此,真正的问题是该技巧是否可以被标准接受,还是将以任何方式更改类(或其成员)的签名。
我知道friend
和PIMPL
是用于这种工作的,但是friend
可能会变得非常凌乱,并且PIMPL
的性能(间接和您无法直列的事实)是我正在处理的代码库是不可接受的。。
这是odr违规行为,因此调用了未定义的行为。(另请参见Basic.def.odr]/6.1" D的每个定义应由同一代币序列组成")。
但是,一个普遍的实施是公共,私人保护对班级布局没有影响,因此它可以起作用。
你在薄冰上滑冰;没有什么可以阻止编译器将所有公共成员,然后是受保护的成员,然后是私人成员。总的来说,更重要的是,声明的顺序必须是内存中的顺序SO
struct T {char a; int b; char c};
必须具有a
,然后是b
,然后是c
。这是为了确保C兼容性。但是,对具有不同访问访问的元素的排序不需要(请参阅[class.mem]/9.2 p13:"分配了具有相同访问控制(第11条)的(非工会)类的非静态数据成员,以便后来的成员在类对象中具有较高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序(第11条)"。因此,给定
struct T {char a; int b; private: char c};
编译器可以重新排序成员,并将c
放在a
和b
之间的差距中。
对EJP和其他认为这些声明而不是定义的人的最终注释:我给出了上面T
的两个定义;A 声明看起来像struct T;
。
编辑:感谢Fanael的标准。
C 最初似乎认为可以将私人成员放在公共成员旁边以外的地方,也许他们可以是硬件中受保护的地区,因此可以想象公众和公众私人部分可以相对于彼此移动。
可以测试您的代码而不使用Herb Stutter 76的技巧重新定义公共/私人,并在此处使用此数据完成了功能齐全的系统。
给出了一个类,如下..
struct A {
A(int a):a(a) { }
private:
int a;
};
需要一个强盗...
template<typename Tag, typename Tag::type M>
struct Robber {
friend typename Tag::type get(Tag) {
return M;
}
};
一个允许多次抢断的公用事业类..
template<typename Tag, typename Member>
struct TagBase {
typedef Member type;
friend type get(Tag);
};
声明盗窃意图变为
struct A_f : TagBase<A_f, int A::*> { };
template struct Robber<A_f, &A::a>;
然后窃取数据....
int main() {
A a(42);
std::cout << "proof: " << a.*get(A_f()) << std::endl;
}
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在容量内调整矢量大小时的性能影响
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 海湾合作委员会手册中提到的"C++ ABI Specification"是什么?
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- 未达到的情况会影响开关外壳性能
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在AAPCS(ARM ABI)下,C/C++结构填充的稳定性如何
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- 模板如何影响C++中隐式声明的规则?
- 命名空间信息会影响C++的可读性
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 如果我只使用指向基类的指针,更改私有派生类是否会影响 ABI?
- 私人/保护/公众如何影响ABI
- Java本机接口(JNI)是否受到c++ ABI兼容性问题的影响