英文:
How to store the address pointed to by a pointer?
问题
我正在尝试创建一个地址映射表,用于存储我使用new()
创建的对象的地址和分配时间。键是通过调用new()
返回的地址。如何获取new()
返回的地址?
type T struct{a, b int }
func main(){
var t int64 = time.Nanoseconds()
memmap := make(map[uintptr]int64)
fmt.Printf("%d\n", t)
var ptr *T = new(T)
ptr.a = 1
ptr.b = 2
fmt.Printf("%d %d %p %T\n", ptr.a, ptr.b, ptr, ptr)
memmap[uintptr(unsafe.Pointer(ptr))] = t
}
请告诉我在映射表中键字段的类型应该是什么,以便我可以存储new()
返回的地址?我计划使用不同类型的new()
,获取分配的地址并将其与创建时间进行映射。
英文:
I am trying to create a map of addresses of objects that I create with the time at which it is allocated. The key is the address returned by the call to new()
. How do I get the address returned by new()
?
type T struct{a, b int }
func main(){
var t int64 = time.Nanoseconds()
memmap := make(map[uint8]int64)
fmt.Printf("%d\n", t)
var ptr *T = new(T)
ptr.a = 1
ptr.b = 2
fmt.Printf("%d %d %p %T\n", ptr.a, ptr.b, ptr, ptr)
//memmap[ptr] = t //gives error
//var temp uint8 = ptr//gives error
}
Please tell me what should be the type of the key field in the map so that I can store the address returned by new()
? I plan to use new()
with different types, get the allocated address and map it with the creation time.
答案1
得分: 7
你可以使用unsafe
包中的Pointer
类型,但是正如包名所暗示的那样,它是不安全的。地址本身是一个不透明的东西,实际上仅使用地址值本身来进行映射是很少有用的,最好使用类型和地址的元组。这就是unsafe.Reflect
提供的功能。reflect
包提供了UnsafeAddr
函数和更多功能。
我建议你阅读reflect
和unsafe
包的文档。
英文:
You can use the type Pointer
from the unsafe
package, but that is, the package name implies it, unsafe. The address itself is a opaque thing and there's only little use in actually using a address value alone for a map, better use a tuple of type and address. That's what unsafe.Reflect
does provide you. The package reflect
offers you the function UnsafeAddr
and a lot more.
I suggest you read the package documentation for reflect
and unsafe
packages.
答案2
得分: 3
使用uintptr,一个足够大的无符号整数来存储指针值的未解释位,作为内存映射的键类型。
例如,
package main
import (
"fmt"
"time"
"unsafe"
)
type T struct{ a, b int }
func main() {
memmap := make(map[uintptr]int64)
pT := new(T)
memmap[uintptr(unsafe.Pointer(pT))] = time.Nanoseconds()
pT.a = 1
pT.b = 2
fmt.Printf("%d %d %p %T\n", pT.a, pT.b, pT, pT)
pI := new(int)
memmap[uintptr(unsafe.Pointer(pI))] = time.Nanoseconds()
*pI = 42
fmt.Printf("%d %p %T\n", *pI, pI, pI)
fmt.Printf("\n%T\n", memmap)
for k, v := range memmap {
fmt.Printf("%x: %d\n", k, v)
}
}
输出:
1 2 0xf8400001f8 *main.T
42 0xf8400001f0 *int
map[uintptr] int64
f8400001f0: 1306837191421330000
f8400001f8: 1306837191421293000
英文:
Use uintptr, an unsigned integer large enough to store the uninterpreted bits of a pointer value, as the memory map key type.
For example,
package main
import (
"fmt"
"time"
"unsafe"
)
type T struct{ a, b int }
func main() {
memmap := make(map[uintptr]int64)
pT := new(T)
memmap[uintptr(unsafe.Pointer(pT))] = time.Nanoseconds()
pT.a = 1
pT.b = 2
fmt.Printf("%d %d %p %T\n", pT.a, pT.b, pT, pT)
pI := new(int)
memmap[uintptr(unsafe.Pointer(pI))] = time.Nanoseconds()
*pI = 42
fmt.Printf("%d %p %T\n", *pI, pI, pI)
fmt.Printf("\n%T\n", memmap)
for k, v := range memmap {
fmt.Printf("%x: %d\n", k, v)
}
}
Output:
1 2 0xf8400001f8 *main.T
42 0xf8400001f0 *int
map[uintptr] int64
f8400001f0: 1306837191421330000
f8400001f8: 1306837191421293000
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论