内存对齐是个硬件问题,本身并不是一个C/C++的问题,只是因为C/C++能够直接操作内存指针,才有了对此优化的可能性。
严格的说,对齐(alignment)甚至不是一个CPU问题,而是MMU(内存/缓存)问题。
简单说,对齐有助于提升缓存使用效率。cache的设计,每条line都是一个对齐的空间,比如32字节。用它们的地址低位索引。如果你读写到一个地址和当前cache line失配,就会引发该line的write back和reload,也就说,有性能成本。而且,如果你熟悉芯片设计的话,就知道这个成本是惊人的。很多软件工程师可能意识不到,多数情况下,cpu只有极少的时间在执行指令,大部分时间都在干等,等缓存。
所以,对于有性能优化要求的程序来说,多数情况下优化内存是第一位的。非对齐的内存访问,非常容易造成一次刷新两条cache lines,此时很可能造成本来还很快有用的数据被洗出缓存,不但增加了本次操作的成本,更重要的是,下次还得再次把洗出的数据装回来,这个代价很大,更糟糕的是,下次这笔操作很可能继续导致新的有用数据被洗出,循环往复。
据我观察,如今99%的程序员对cpu内存架构几乎一无所知,代码几乎完全不考虑性能。的确,多数场合这也无所谓。反正,硬核的活儿都给那剩下1%的人干了。