为了账号安全,请及时绑定邮箱和手机立即绑定

多个整数是否存储在同一内存位置以节省空间?

多个整数是否存储在同一内存位置以节省空间?

Go
至尊宝的传说 2022-08-24 16:56:45
如果我在具有 64 位内存位置的计算机上以 Go/C 声明两个 32 位整数。它们可以存储在同一内存位置吗?最左边的 32 位存储第一个整数,右边最右边的 32 位存储第二个整数。或者,您声明的每个变量都存储在其自己的内存位置。换句话说:使用与 ? 相同的内存位置量1000 x int321000 x int64
查看完整描述

2 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

寄存器和RAM存储器是两回事。编译器通常会决定将哪些变量保留在哪里。在RAM的情况下,如果它每个变量使用32位,则地址仍然不同。当然,如果这提高了性能,它肯定可以使用64位并“浪费”32位。对于寄存器,编译器将被允许对不同的变量使用低阶和高阶位,但几乎肯定不会,因为这会降低性能。


查看完整回答
反对 回复 2022-08-24
?
慕仙森

TA贡献1827条经验 获得超7个赞

如果我在具有 64 位内存位置的计算机上以 Go/C 格式声明两个 32 位整数,它们是否可以存储在同一内存位置?


不,当然不是,因为那样他们就不可能有不同的价值观。


64 位架构仍然可以寻址内存中的每个字节。在 C 语言中,将 void 指针递增 1 会使它指向下一个字节,而不是下一个 qword。与 32 位地址相比,您可以寻址更多的单个字节。


因此,[1000]int32是[1000]int64的一半:


package main


import (

    "fmt"

    "unsafe"

)


func main() {

    var x [1000]int32

    var y [1000]int64


    fmt.Println(unsafe.Sizeof(x)) // 4000

    fmt.Println(unsafe.Sizeof(y)) // 8000

}

请注意,在Go中,这是一个实现细节,取决于编译器,但是没有一个健全的编译器会通过将所有内容对齐在8个字节上来浪费大量内存。


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信