gpt4 book ai didi

c# - 使用哪些数据类型? CPU 如何读取它们?

转载 作者:太空狗 更新时间:2023-10-30 00:25:05 24 4
gpt4 key购买 nike

让我们从小处着手,假设我需要存储一个 200 的常量值,我是否应该始终为此使用无符号字节?

我猜这只是一件小事。但是结构呢?构建我的结构以便它在 32 位系统上可以被 32 整除是否明智?假设我需要遍历一个非常大的结构数组,如果结构由 34 位或 64 位组成,这有多大关系?如果我能从 34 位结构中挤出 2 位,我会认为它有很多收获吗?

或者所有这些是否会产生不必要的开销,我是否最好将我的所有位和短裤替换为该结构内的整数,这样 CPU 就不必“去寻找”正确的内存块?

最佳答案

这是一个强大的处理器实现细节,CLR 和抖动已经做了很多工作来确保您的数据类型是最佳的,以便从程序中获得最佳性能。例如,从来没有一个结构占用 34 位的情况,CLR 设计选择已经确保您可以开始使用在现代处理器上运行良好的类型。

结构的布局是最优的,这涉及到根据数据类型选择对齐方式。例如,int 将始终与 4 的倍数的偏移量对齐。这使处理器可以轻松读取 int,它不必多路复用将未对齐的字节返回到一个 int 中,并避免了值跨越 cpu 缓存行并且需要从多个内存总线读取中粘合在一起的情况。一些处理器事件将未对齐的读取和写入视为 fatal error ,这是您的机器中没有 Itanium 的原因之一。

因此,如果你有一个包含一个字节和一个整数的结构,那么你最终会得到一个占用 8 个字节的数据类型,它不使用 3 个字节,即字节和整数之间的字节。这些未使用的字节称为填充。也可以在结构的末尾进行填充,以确保将它们放入数组时对齐仍然是最佳的。

将单个变量声明为字节是可以的,Intel/AMD 处理器读取/写入一个变量所花费的时间与读取/写入 32 位 int 所花费的时间相同。但是使用 short 是不行的,这需要 cpu 指令中的额外字节(大小覆盖前缀)并且可能会花费额外的 cpu 周期。实际上,由于对齐规则,您通常不会保存任何内存。如果它可以与另一个字节组合,使用字节只会给你买东西。字节数组很好,具有多个字节成员的结构也很好。您的示例不是,当您将它声明为 int 时,它同样有效。

在 C# 代码中使用小于 int 的类型可能很尴尬,MSIL 代码模型是基于 int 的。 + 和 - 等基本运算符仅针对 int 和更大的类型定义,没有针对更小类型的运算符。因此,您最终不得不使用强制转换将结果截断为更小的尺寸。最佳点是int

关于c# - 使用哪些数据类型? CPU 如何读取它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com