C++ 处理小于cpu数据总线的数据类型。(c+;+;转换为机器代码。)

C++ 处理小于cpu数据总线的数据类型。(c+;+;转换为机器代码。),c++,assembly,ram,C++,Assembly,Ram,在以下答案中: CPU访问内存的方式解释得相当清楚。假设我们创建的数据类型比CPUS数据总线小,如C++ Car;CPU读取的数据总线大小的内存块如何修改以作为预期类型在寄存器中使用?指定的字节是否已移位,以便它占用寄存器中的最低有效字节(如果尚未占用)?然后,是否将多余的(根据类型大小)最高有效字节设置为0 CPU是否可以将一个/多个修改过的单个字节写入一个/多个内存地址,或者是否必须将整个总线大小块写入所用字节占用的总线大小内存插槽?这对于处理器来说是非常具体的。有些人有多种选择。加载字节指

在以下答案中:

CPU访问内存的方式解释得相当清楚。假设我们创建的数据类型比CPUS数据总线小,如C++ Car;CPU读取的数据总线大小的内存块如何修改以作为预期类型在寄存器中使用?指定的字节是否已移位,以便它占用寄存器中的最低有效字节(如果尚未占用)?然后,是否将多余的(根据类型大小)最高有效字节设置为0


CPU是否可以将一个/多个修改过的单个字节写入一个/多个内存地址,或者是否必须将整个总线大小块写入所用字节占用的总线大小内存插槽?

这对于处理器来说是非常具体的。有些人有多种选择。加载字节指令的常见选项是将高位置零或对高位进行符号扩展。因此,如果处理器拥有0x000000AB或0xFFFFFFAB,则将0xAB加载到32位寄存器中。有些处理器用其他方法解决这个问题

cpu总线的工作方式由cpu决定。如果没有加载/存储字节(加载/存储半字、加载/存储字)指令,处理器将不会非常成功。但是,有不同的方法来实现总线,正如x86和其他随着时间的推移而发展的总线一样。出于性能原因,今天您通常需要32或64或更宽的总线,平衡过大会带来更大的惩罚,平衡过小会限制性能。不需要,但通常我们有一级缓存,有时二级缓存有许多原因,但缓存的固定宽度较大,例如32位或64位,因此较小的传输需要读-修改-写,以便写入该sram。这不是处理器的问题,也不是总线上要解决的问题,总线/内存控制器将捕获写入信息(地址、数据和大小),然后处理另一侧的sram或总线

读操作通常由cpu处理,如果您在32位或64位总线上执行8位读操作,则结果将在总线定义的字节通道上返回,处理器然后从指令中知道要从总线上取下多少数据、总线上的位置以及如何处理(直接进入alu、寄存器、签名或零扩展等)

由于目标端通常是为该总线设计的缓存或外围设备,因此读取不一定需要设计为指示子总线大小,它们的长度通常以总线宽度为单位,因此32位总线上的128位传输的长度为4,开销发生在总线之间,理想情况下,四个时钟的突发将移动数据(而不是四个32位传输,每次传输的所有开销)。但是单个或子大小的读取只会显示为单个宽度的读取,处理器会隔离感兴趣的字节

对于写入,通常有一个长度指示符或一个字节掩码,如果它是一个32位宽的总线,分成4字节通道,那么将有一个4位掩码,向另一端指示写入的哪些字节是有效的,哪些字节不使用/应用,并根据需要驱动读-修改-写入。例如,如果在arm上使用三个寄存器进行stm,并且内核使用64位宽的总线,那么这将显示为两个传输,一个32位,一个64位,如果它使用32位宽的总线,那么很可能是一个长度为3的单次传输。(尽管我见过一个arm总线,但它的写操作长度不超过总线的2个宽度)

对于较小的传输总是有一个惩罚,这是一个你是否能看到它的问题,而不是基于其他处理器/系统开销。对于x86,您不一定会看到开销带来的损失,但是arm有时会看到,它执行四字节大小的传输,而不是一个32位的传输,甚至两个16s而不是一个32位的传输。但这要视情况而定,这并不意味着你会看到它,它只是意味着你可能会看到它。要知道arm制造的是核心,而不是芯片,所以芯片的大部分与arm无关,但总体性能与芯片供应商而不是arm有很大关系

编辑 第二次尝试

对于写入,cpu总线通常支持Fuz指示的各种大小。如今,CPU(处理器核心)不必处理远端发生的读-修改-写操作

对于读取,cpu总线通常读取一个完整的总线宽度,处理器必须处理它。但是总线和处理器被设计成一个系统。根据指令,处理器将提取正确数量的位,并对其进行补零或符号扩展

这一切都严重依赖于处理器/芯片


我已经看到,根据指令、总线、地址、大小的不同,一条指令可以/可能变成多个总线事务,这是有道理的。

总线通常具有各种数据宽度的事务类型。不确定您真正想要的是什么,所以基本上一个指令中有两个单独的答案是的,一切都很清楚。我必须向阅读本文的其他人建议,他们尽可能多地研究汇编,就像我已经做过(有些)并且将自己做的那样,以了解CPU的真正工作原理,然后提出关于具体汇编的问题,而不是像我在这里做过的一些抽象概念。通用处理器既相似又不同。因此,像这样的问题,虽然泛型并不一定需要更多的表面知识。其他事情是肯定的,可以是特定于处理器的,而不是通用的。。