我有一个由模板参数组成的4个字段的结构:
templatestruct __attribute__((aligned(8))) four_tuple { typedef struct { T1 t1; T2 t2; T3 t3; T4 t4; } payload; payload p; };
每种类型T1
,T2
,T3
,和T4
,保证是原始类型或four_tuple<...>::payload
类型.保证是递归的 - 您可以将结构视为编码其叶节点是基本类型的四叉树.
我的目标是使结构具有最小可能性sizeof
,但条件是所有叶节点都正确对齐.允许优化的工具是类模板特化,使用:
字段重新排序t1
,t2
,t3
,t4
添加填料场
GCC属性packed
上payload
也许其他人?
我觉得使用enable_if
和SFINAE 这个问题有一个聪明的解决方案.谁能找到它?
为了说明这个问题,如果我们按原样使用上面的实现,那么using Foo = four_tuple
对于有效载荷和整体来说,我们的大小为32.如果我们只是声明有效载荷packed
,那么它们double
就不会很好地对齐.即重新安排场按递减顺序(在这里,A模板特double, double, char, char
)会给出一个有效载荷和24整体大小,但它使用的是浪费,因为可以通过考虑可以看到额外的6个字节using Bar = four_tuple
.以最佳的包装Bar
可以装在32个字节,但该方案将需要40不客气地将现场与重新排序packed
将导致错位int
的中Bar
-需要一些填料.
我知道,在一般的结构调整结构的字段的内存布局可以由于缓存的考虑性能的影响,而且在一般这些影响将至少从更好的堆积任何潜在收益为显著.不过,我想探讨这些权衡,如果不解决这个问题,我无法在我的背景下做到这一点.