在许多系统上,在这种情况下,它需要是size
四的倍数(取决于下面详述的其他条件,包括int
系统上的大小为四个字节)。在不需要这个的系统上,它通常是首选。
首先, 的类型head
是void *
,C 标准没有定义使用 进行指针运算时会发生什么void *
。
一些编译器,尤其是 GCC 及其继承者,会将这种算术视为类型是char *
. 我将在此基础上进行。
其次,我不知道sbrk
返回具有任何特定对齐方式的地址的保证。
让我们假设它sbrk
确实返回了一个对齐良好的地址,并且您的 C 实现做了简单的事情来评估* (int *) (head + size) = value
,即发出存储指令将value
(转换为int
)的值写入地址head + size
。
那么你的问题就变成了:我的计算平台int
对这个地址的商店做了什么?
只要head + size
地址int
在您的平台上适当对齐,商店就会按预期执行。在大多数平台上,四字节整数更喜欢四字节对齐,八字节整数更喜欢八字节对齐。只要head
对齐到这个preferencesize
的倍数并且是这个preference的倍数,那么store就会正常执行。
否则,会发生什么取决于您的平台。在某些平台上,硬件执行存储但可能比正常的存储指令执行得更慢,因为它将它分成两个单独的内存写入。(这也意味着共享相同内存的其他进程可能能够在一部分值已存储但另一部分未存储时读取内存。同样,这取决于您的计算平台的特性。)
在某些平台上,硬件会发出异常信号,中断程序执行并将控制权转移给操作系统。一些操作系统通过分析失败的指令并执行执行预期存储的替代指令来修复未对齐的存储(或者操作系统将异常中继到程序中的特殊代码,可能在自动包含的库中,这些代码执行此修复工作) . 在这些平台上,错位的店铺会很慢;它们会极大地降低程序的性能。
在某些平台上,硬件会发出异常信号,并且操作系统不会修复未对齐的存储。相反,操作系统要么终止您的进程,要么向它发送有关问题的信号,这通常会导致您的进程终止。(其他可能性包括触发调试器或输入您在程序中包含的特殊代码来处理信号。)