聘我网

新概念招聘3.0

什么时候需要手动对齐?

vote up0vote downstar
  struct {              /* Fileheader */
    uchar file_version[4];
    uchar options[2];
    uchar header_length[2];
    uchar state_info_length[2];
    uchar base_info_length[2];
    uchar base_pos[2];
    uchar key_parts[2];         /* Key parts */
    uchar unique_key_parts[2];      /* Key parts + unique parts */
    uchar keys;             /* number of keys in file */
    uchar uniques;          /* number of UNIQUE definitions */
    uchar language;         /* Language for indexes */
    uchar max_block_size_index;     /* max keyblock size */
    uchar fulltext_keys;
    uchar not_used;                     /* To align to 8 */
  } header;

以上是出自MySQL源码,

为何要用not_used对齐到8字节呢?

 

1 个答复

vote up0vote downcheck

对齐后执行效率更高。

这段代码

struct s { char c[N]; };
int func(struct s *p, int i) { return p[i].c[0]; }

N23func编译成

leaq    (%rsi,%rsi,2), %rax
salq    $3, %rax
subq    %rsi, %rax
movsbl  (%rax,%rdi),%eax

N24

leaq    (%rsi,%rsi,2), %rax
movsbl  (%rdi,%rax,8),%eax

N32

salq    $5, %rsi
movsbl  (%rsi,%rdi),%eax

显然对齐后简化不少。

再看一段:

unsigned char *data = malloc(size);
fill(data);
header *h = (header *) data;
do_something_with(h);
uint32_t x = *(uint32_t *) (data + sizeof(header));

如果header的尺寸不是4的倍数

SPARC平台上,会crash

x86平台上,会相对更慢,

因为无法直接将数值直接loadAL,AX,EAX,RAX等任何一个寄存器

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.