文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

为何Go常使用未对齐地址存储字符串数据

2024-04-04 23:39

关注

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《为何Go常使用未对齐地址存储字符串数据》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我读过很多关于内存中值对齐的重要性的内容,因为访问未对齐的地址可能会减慢操作速度,或者根本无法工作,具体取决于 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 字节边界上对齐,否则访问它可能需要两次内存访问而不是一次。类似地,64 位值应在 8 字节边界上对齐,但在 32 位系统(即到内存的 32 条数据线)中,4 字节边界就足够了,因为无论如何都需要两次内存访问。

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

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

以上就是《为何Go常使用未对齐地址存储字符串数据》的详细内容,更多关于的资料请关注编程网公众号!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯