我在 C 中有這個例子
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main()
{
uint32_t dest[4];
uint8_t src[16] = {0x11, 0x12, 0x13, 0x14,
0x22, 0x22, 0x22, 0x22,
0x33, 0x33, 0x33, 0x33,
0x44, 0x44, 0x44, 0x44};
memcpy(dest, src, sizeof(src));
printf("X X X X\n", dest[0], dest[1], dest[2], dest[3]);
return 0;
}
我正在遷移到 golang,我不想使用 C.memcpy,我正在尋找一種快速的替代方案。這是我的代碼
package main
import (
"fmt"
"encoding/binary"
)
func main() {
dest := make([]uint32, 16)
var src = []byte{0x11, 0x12, 0x13, 0x14,
0x22, 0x22, 0x22, 0x22,
0x33, 0x33, 0x33, 0x33,
0x44, 0x44, 0x44, 0x44}
dest[0] = binary.LittleEndian.Uint32(src[0:4])
dest[1] = binary.LittleEndian.Uint32(src[4:8])
dest[2] = binary.LittleEndian.Uint32(src[8:12])
dest[3] = binary.LittleEndian.Uint32(src[12:16])
fmt.Printf("X X X X\n", dest[0], dest[1], dest[2], dest[3])
}
我可以在不使用 C.memcpy 的情況下用一條指令轉換 uint32 陣列中的位元組陣列嗎?我嘗試使用副本但出現錯誤。我知道我可以使用這個結構
C.memcpy(unsafe.Pointer(&dest[0]), unsafe.Pointer(&src[0]), 16)
我想了解是否存在有效的替代方案
uj5u.com熱心網友回復:
unsafe.Pointer是繞過 Go 型別系統的方法,使用unsafe包的所有注意事項。要獲得等效的memcpy,您可以像這樣傳遞您的dest切片copy:https : //play.golang.org/p/MFJjHhDZatl
copy(unsafe.Slice((*byte)(unsafe.Pointer(&dest[0])), len(src)), src)
但是,我仍然會確保運行一些基準測驗,以確保您的用例實際上受益于這種型別的優化。大多數情況可以使用更安全的方法,而不會對性能產生明顯影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347813.html
標籤:走
