Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么bool占用7字节的内存?_Swift_Swift Playground_Memory Layout - Fatal编程技术网

Swift 为什么bool占用7字节的内存?

Swift 为什么bool占用7字节的内存?,swift,swift-playground,memory-layout,Swift,Swift Playground,Memory Layout,我正在研究使用Xcode游乐场的Swift内存布局,我创建了一个包含bool、double和int32的结构,如下所示。基于此结构,MemoryLayout的打印结果应该是13,但它将打印20。你知道为什么吗?也许我错过了什么。谢谢 struct SampleStruct { //0 var bool: Bool = true //1 var double: Double = 1 //8 var int32: Int32 = 122 //4 } MemoryLayout

我正在研究使用Xcode游乐场的Swift内存布局,我创建了一个包含bool、double和int32的结构,如下所示。基于此结构,MemoryLayout的打印结果应该是13,但它将打印20。你知道为什么吗?也许我错过了什么。谢谢

struct SampleStruct { //0
    var bool: Bool = true //1
    var double: Double = 1 //8
    var int32: Int32 = 122 //4
}

MemoryLayout<SampleStruct>.size //Should print 13, but prints 20

struct SampleStruct{//0
var bool:bool=true//1
变量double:double=1//8
变量int32:int32=122//4
}
MemoryLayout.size//应打印13,但打印20
基于此结构,MemoryLayout的打印结果应该是13,但它将打印20。你知道为什么吗

处理器通常喜欢将较大的类型与与其总线大小匹配的边界对齐。结构中的double是8字节长,如果它存储在8的倍数的地址上,那么编译它的64位处理器可以在一次操作中读取它,因此编译器将它放在那里


切勿在操场上测试记忆力或表现。在设置为发布模式的真实应用程序项目中进行测试。您将在中找到精确的对齐和填充规则。将顺序更改为double、int32、bool,并观察大小的变化!是的,马丁。成功了!不知道为什么。我将查看您发送的GitHub repo。我知道,但如果我正确遵循您的逻辑,它应该打印大小为13(两个8字节的插槽,假设它仍然可以通过1次访问获取每个元素)和跨步16。但是大小是20,跨距是24。@gabrielrf97编译器不重新排序字段,因为这可能会影响代码的某些方面,有1个字节用于布尔值,7个字节用于填充,8个字节用于双精度,4个字节用于float@gabrielrf97你错过了对齐的要点。由于处理器的内存总线连接到RAM的方式,如果值未与右边界对齐,处理器无法在一次操作中读取全宽值。例如,带有64位总线的处理器一次读取8个字节,并从地址0、8、16、24等进行读取。如果在地址0处放置一个1字节bool,然后在地址1处放置8字节双精度,则处理器必须首先读取字节0-7,然后读取8-16,然后将第一个值移到8位上,并将地址8中的字节加上。字段重新排序改变大小的原因是4字节的int不必位于8字节边界上:如果将顺序从
bool,double,int
更改为
bool,int,double
您不需要太多的填充来正确对齐值。你会得到类似于
bpppiiddddddddd
的东西,而不是
bpppppppddddddii
(其中b是bool,i是int,d是double,p是padding)。我已经读了这篇文章,你发送了链接@Caled。非常好!谢谢你的回答,现在我明白了。