当前位置:  开发笔记 > 编程语言 > 正文

最佳地打包递归模板化结构而不会失去对齐

如何解决《最佳地打包递归模板化结构而不会失去对齐》经验,为你挑选了0个好方法。

我有一个由模板参数组成的4个字段的结构:

template 
struct __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属性packedpayload

也许其他人?

我觉得使用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-需要一些填料.

我知道,在一般的结构调整结构的字段的内存布局可以由于缓存的考虑性能的影响,而且在一般这些影响将至少从更好的堆积任何潜在收益为显著.不过,我想探讨这些权衡,如果不解决这个问题,我无法在我的背景下做到这一点.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有