【发布时间】:2020-04-10 05:39:56
【问题描述】:
我想要做的是让一个类知道它在封闭类中的偏移量,而根本没有运行时开销。这是我希望我能做的一个例子:
template<int offset>
struct Inner {
};
struct Outer {
int placeholder;
Inner<offsetof(Outer, ptr)> ptr;
};
上面的代码无法编译,因为offsetof(Outer, ptr) 不知道ptr(它有助于定义它)。我已经实现了相同想法的几个版本,它们确实会产生运行时开销(在内存和执行指令中),但是我在实现“0 运行时开销”版本时遇到了麻烦,就像我上面的梦想实现一样。任何想法如何做到这一点?
【问题讨论】:
-
在课程完成之前,您无法知道课程的布局是什么,所以我不确定您可以做些什么来实现零运行时间成本。不确定一旦我们得到反射是否会有所帮助。这有什么用例?
-
我将其用于在计算机体系结构研究中跟踪访问的特定方法,因此其他方法在上下文中不起作用。虽然是的,但在类完成之前无法知道布局,但我确信有一些编译时解决方法 - 可能是某种包装类或其他东西。我只是想不出来:(
-
如果
Inner的大小是固定的,那么Outer的布局无法计算的根本原因。我同意我的梦想方法行不通,但我真的希望有某种解决方法,因为我认为没有什么实际上阻止它(以某种方式)起作用。 -
“如果
Inner的大小是固定的”。一般情况下很难知道(可能有专业化)。 -
@antonin_salia Inner 的大小无关紧要。它的对齐方式可以。如果您可以保证
Inner的固定对齐方式,例如alignas(X),那么无论Inner内部可能是什么,它在Outer内的偏移量都是固定的(至少实际上;理论上,编译器可以插入填充为他们希望,但实际上他们这样做只是为了对齐)。
标签: c++ templates offset offsetof