在结构中安排字段的哪种方式更好?

时间:2013-11-16 13:19:52

标签: c performance structure

我有两种方法来安排结构中的字段

  struct foo {  
    float   a;
    double  b;
    float   c;
    double  d;
    short   e;
    long    f;
    short   g;
    long    h;
    char    i;
    int     j;
    char    k;
    int     l;
  };




  struct foo {  
    double  b;
    double  d;
    long    f;
    long    h;
    float   a;
    float   c;
    int     j;
    int     l;
    short   e;
    short   g;
    char    i;
    char    k;
  };

应该练习哪一个?为什么?

4 个答案:

答案 0 :(得分:2)

排列结构成员的最佳方法是按其大小按顺序放置它们。 Doing this, you reduce the padding需要data alignment

另外,使用一些preprocessor directives可以修改对齐方式,例如:

#define packed_data __attribute__((__packed__))

将其关闭。使用这个,成员顺序不再重要,但我强烈反对这一点,因为内存分配已针对性能进行了优化。

答案 1 :(得分:1)

第二种安排更可取。

在结构中,最小化由填充引起的位存储丢失

(存储器中各种变量的边界对齐),最好开始

具有最大尺寸变量的结构。从较高到较小。

  1. 请参阅结构中的填充

  2. C

    中变量类型的大小

    http://www.cquestions.com/2011/02/size-of-data-types-in-c.html

答案 2 :(得分:0)

排序字段的一种合理方式是它们的目的相似。 例如:

struct window {
    MENU   *menu ;
    int    width ;
    char   *name ;
    WINDOW *child ;
    int    xpos ;
    int    height ;
    void   *info ;
    WINDOW *next ;
    CLASS  *class ;
    int    ypos ;
    WINDOW *parent ;
    }

看起来会更好

struct window {
    CLASS  *class ;
    void   *info ;
    char   *name ;
    int    xpos ;
    int    ypos ;
    int    width ;
    int    height ;
    WINDOW *parent ;
    WINDOW *next ;
    WINDOW *child ;
    MENU   *menu ;
    }

答案 3 :(得分:0)

填充是支持一种安排而不是另一种安排的一个原因。另一种选择是按字段的频率或内存访问模式对字段进行排序。这当然是微优化,但在极端情况下可以获得回报。

许多或大多数CPU架构在具有较小操作码的指针中编码较小的偏移量;将最常访问的元素偏移为零可以在特别是RISC架构中减少指令数量,并使代码运行得更快。

如果'y'与'y'同时使用,将它们放在同一个缓存行中是有益的,而不是面临每个结构有两个或更多缓存未命中的风险。