gpt4 book ai didi

go - 为什么经常将字符串数据存储在未对齐的地址中

转载 作者:行者123 更新时间:2023-12-01 20:26:52 25 4
gpt4 key购买 nike

我已经阅读了很多有关内存中值对齐的重要性的信息,因为访问未对齐的地址可能会减慢操作速度,或者完全不起作用,具体取决于CPU架构(一个引用https://syslog.ravelin.com/go-and-memory-layout-6ef30c730d51)。但是后来我注意到,在Go中实例化一个简单字符串时,它通常将字符串值存储在未对齐的地址中。

通过运行以下代码可以看到:

package main

import (
"fmt"
"unsafe"
"reflect"
)

func main() {
testString:= "testString"

fmt.Println(fmt.Sprintf("Data is at address %d", ((*reflect.StringHeader)(unsafe.Pointer(&testString))).Data))
}

https://play.golang.org/p/d1eX0nP3AgV上运行时,我不断得到:
Data is at address 1140305
1140305显然不能被 48整除。

有人可以解释为什么Go将这个值存储在一个未对齐的地址中吗?使用对齐的不是更好吗?这仅仅是为了不浪费空间,而是依靠现代CPU可以处理的事实。还是因为虚拟内存层抽象了物理内存地址并且实际上物理地址已经正确对齐?

最佳答案

没错,一个32位值(例如整数)应该在4字节边界上对齐,否则访问它可能需要两次内存访问,而不是一次。类似地,尽管在32位系统(即到内存的32条数据线)中,一个4字节的边界就足够了,但仍应在8字节的边界上对齐一个4字节的边界,因为无论如何都需要两次内存访问。

但是,Go中字符串的数据实际上是一个字节数组,因此具有没有对齐要求。如果在C中打印字符串的地址,您会发现同样的事情(出于效率原因,它非常在乎对齐)。

对齐一旦理解就相当简单,但是需要大量解释。我在http://devmethodologies.blogspot.com/2013/04/alignment-and-pragma-pack.html上(针对C)写过它。

关于go - 为什么经常将字符串数据存储在未对齐的地址中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60572169/

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