国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何讓你的結(jié)構(gòu)體更高效

這篇具有很好參考價(jià)值的文章主要介紹了如何讓你的結(jié)構(gòu)體更高效。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

文中所涉及到的代碼運(yùn)行結(jié)果均是在64位機(jī)器上執(zhí)行得到的.

基礎(chǔ)知識(shí)回顧

在Go中,我們可以使用unsafe.Sizeof(x)來查看變量所占的內(nèi)存大小。以下是Go內(nèi)置的數(shù)據(jù)類型占用的內(nèi)存大?。?/p>

類型 內(nèi)存大小(字節(jié)數(shù))
bool 1
int8/uint8 1
int/uint 8
int32/uint32 4
int64/uint64 8
float32 4
float64 8
complex64 8
complex128 16
指針類型:*T, map,func,chan 8
string 16
interface 16
[]T 24

func main() {
	fmt.Println(unsafe.Sizeof(true))     // 1
	fmt.Println(unsafe.Sizeof(int8(1)))  // 1
	fmt.Println(unsafe.Sizeof(int(1)))   // 8
	fmt.Println(unsafe.Sizeof(int32(1))) // 4
	fmt.Println(unsafe.Sizeof(int64(1))) // 8

	fmt.Println(unsafe.Sizeof(float32(1.0))) // 4
	fmt.Println(unsafe.Sizeof(float64(1.0))) // 8

	a := int(1)
	fmt.Println(unsafe.Sizeof(&a)) // 8

	s := "1234"
	fmt.Println(unsafe.Sizeof(s)) //16

	var b interface{}
	fmt.Println(unsafe.Sizeof(b)) //16

	fmt.Println(unsafe.Sizeof([]string{})) // 24
	fmt.Println(unsafe.Sizeof([]int{}))    // 24
}

簡單示例

對(duì)于一個(gè)結(jié)構(gòu)體,其占用的內(nèi)存大小應(yīng)該是其內(nèi)部多個(gè)基礎(chǔ)類型占用內(nèi)存大小之和。但實(shí)際情況并非如此,甚至字段順序不同,結(jié)構(gòu)體的大小也不同:

type Example1 struct {
	a int32 // 4
	b int32 // 4
	c int64 // 8
}

type Example2 struct {
	a int32 // 4
	c int64 // 8
	b int32 // 4
}

type Example3 struct {
	a bool   // 1
	b int8   // 1
	c string // 16
}

func main() {
	fmt.Println(unsafe.Sizeof(Example1{})) // 16
	fmt.Println(unsafe.Sizeof(Example2{})) // 24
    fmt.Println(unsafe.Sizeof(Example3{})) // 24,并不是1+1+16=18
}

為什么會(huì)出現(xiàn)上面的情況呢?這就引出了本文的重點(diǎn):內(nèi)存對(duì)齊

內(nèi)存對(duì)齊

內(nèi)存對(duì)齊(Memory Alignment)是指數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中存儲(chǔ)時(shí)按照特定規(guī)則對(duì)齊到內(nèi)存地址的過程。內(nèi)存對(duì)齊是由計(jì)算機(jī)硬件和操作系統(tǒng)所決定的,它可以提高內(nèi)存訪問效率和系統(tǒng)性能。

在計(jì)算機(jī)體系結(jié)構(gòu)中,內(nèi)存是以字節(jié)(byte)為單位進(jìn)行訪問的。數(shù)據(jù)類型在內(nèi)存中占用的字節(jié)數(shù)可以是不同的,例如,整數(shù)可能占用2字節(jié)、4字節(jié)或8字節(jié),而字符可能只占用1字節(jié)。

內(nèi)存對(duì)齊的規(guī)則要求變量的地址必須是其數(shù)據(jù)類型字節(jié)數(shù)的整數(shù)倍。例如,如果一個(gè)變量的數(shù)據(jù)類型是4字節(jié)(32位),那么它的起始地址必須是4的倍數(shù)。

內(nèi)存對(duì)齊的主要目的是優(yōu)化計(jì)算機(jī)的內(nèi)存訪問性能。當(dāng)數(shù)據(jù)按照對(duì)齊要求存儲(chǔ)在內(nèi)存中時(shí),讀取和寫入操作可以更高效地進(jìn)行。如果數(shù)據(jù)沒有按照對(duì)齊要求存儲(chǔ),計(jì)算機(jī)可能需要進(jìn)行多次內(nèi)存讀取操作來獲取完整的數(shù)據(jù),這會(huì)增加訪問延遲和降低系統(tǒng)性能。

在編程中,特別是在使用結(jié)構(gòu)體和類的語言中,內(nèi)存對(duì)齊是一個(gè)重要的概念。編譯器會(huì)根據(jù)數(shù)據(jù)類型的對(duì)齊要求自動(dòng)進(jìn)行內(nèi)存對(duì)齊操作,以確保數(shù)據(jù)存儲(chǔ)的正確性和性能優(yōu)化。但在某些情況下,可以通過顯式地設(shè)置對(duì)齊屬性來控制數(shù)據(jù)的對(duì)齊方式,以滿足特定的需求。

需要注意的是,不同的硬件平臺(tái)和操作系統(tǒng)可能具有不同的內(nèi)存對(duì)齊規(guī)則和要求。因此,在開發(fā)跨平臺(tái)應(yīng)用程序時(shí),應(yīng)當(dāng)考慮到這些差異并遵循適當(dāng)?shù)膬?nèi)存對(duì)齊規(guī)則。

為什么需要對(duì)齊內(nèi)存

內(nèi)存對(duì)齊是為了提高計(jì)算機(jī)系統(tǒng)的內(nèi)存訪問效率和性能而存在的。以下是幾個(gè)需要內(nèi)存對(duì)齊的原因:

  1. 硬件要求:許多計(jì)算機(jī)硬件和體系結(jié)構(gòu)對(duì)內(nèi)存訪問有特定的對(duì)齊要求。如果數(shù)據(jù)沒有按照硬件要求進(jìn)行對(duì)齊,可能會(huì)導(dǎo)致訪問錯(cuò)誤、異常或性能下降。通過滿足硬件對(duì)齊要求,可以確保數(shù)據(jù)能夠按照有效的方式訪問,提高系統(tǒng)的穩(wěn)定性和性能。
  2. 內(nèi)存訪問效率:當(dāng)數(shù)據(jù)按照對(duì)齊要求存儲(chǔ)在內(nèi)存中時(shí),計(jì)算機(jī)系統(tǒng)可以更高效地訪問這些數(shù)據(jù)。對(duì)齊數(shù)據(jù)可以減少或避免多次內(nèi)存訪問,提高數(shù)據(jù)的讀取和寫入速度。這對(duì)于大量的數(shù)據(jù)操作和高性能計(jì)算非常重要。
  3. 緩存性能:現(xiàn)代計(jì)算機(jī)系統(tǒng)中通常有多級(jí)緩存,而緩存的訪問是以特定塊的方式進(jìn)行的。內(nèi)存對(duì)齊可以確保數(shù)據(jù)按照緩存塊的大小對(duì)齊,使得數(shù)據(jù)能夠更好地利用緩存,減少緩存未命中和讀取延遲,提高緩存性能。
  4. 結(jié)構(gòu)體和類的內(nèi)存布局:結(jié)構(gòu)體和類通常包含多個(gè)成員變量,這些變量按照一定的順序存儲(chǔ)在內(nèi)存中。內(nèi)存對(duì)齊確保結(jié)構(gòu)體和類的成員變量按照正確的順序和對(duì)齊要求進(jìn)行存儲(chǔ),避免內(nèi)存空洞和訪問錯(cuò)誤,保證數(shù)據(jù)的正確性和一致性。

總之,內(nèi)存對(duì)齊是為了滿足硬件要求、提高內(nèi)存訪問效率和性能而引入的機(jī)制。通過合理地進(jìn)行內(nèi)存對(duì)齊,可以提高系統(tǒng)的穩(wěn)定性、性能和響應(yīng)速度,并避免潛在的內(nèi)存訪問問題。

如何對(duì)齊內(nèi)存

Go團(tuán)隊(duì)開發(fā)了一款名為fieldalignment的工具可以幫助我們解決內(nèi)存對(duì)齊的問題。

使用下面的命令安裝fieldalignment工具:

$ go install golang.org/x/tools/go/analysis/passes/fieldalignment/cmd/fieldalignment@latest

還是以上面的代碼為例,可以執(zhí)行下面的命令:

$ fieldalignment main.go  
main.go:14:15: struct of size 24 could be 16  
main.go:20:15: struct with 16 pointer bytes could be 8

也可以使用--fix參數(shù)直接修改代碼:

$ fieldalignment --fix main.go

修改后的內(nèi)容如下:

type Example1 struct {
	a int32 // 4
	b int32 // 4
	c int64 // 8
}

type Example2 struct {
	c int64
	a int32
	b int32
}

type Example3 struct {
	c string
	a bool
	b int8
}

如何讓你的結(jié)構(gòu)體更高效

聲明:本作品采用署名-非商業(yè)性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進(jìn)行許可,使用時(shí)請(qǐng)注明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意文章來源地址http://www.zghlxwxcb.cn/news/detail-473202.html


到了這里,關(guān)于如何讓你的結(jié)構(gòu)體更高效的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【⑤MySQL函數(shù)】:讓你的數(shù)據(jù)庫操作更高效(二)

    【⑤MySQL函數(shù)】:讓你的數(shù)據(jù)庫操作更高效(二)

    前言 ?歡迎來到小K的MySQL專欄,本節(jié)將為大家?guī)鞰ySQL日期時(shí)間、條件判斷、系統(tǒng)信息、加密、進(jìn)制轉(zhuǎn)換和IP地址轉(zhuǎn)換函數(shù)的講解 ? 一、日期和時(shí)間函數(shù) 函數(shù) 作用 CURDATE(),CURRENT_DATE() 返回當(dāng)前日期 CURTIME(),CURRENT_TIME() 返回當(dāng)前時(shí)間 NOW(),CURRENT_TIMESTAMP(),LOCALTIME(), SYSDAT

    2024年02月10日
    瀏覽(17)
  • chatgpt賦能python:Python數(shù)值互換:讓你的編程更加高效

    Python是一種高級(jí)編程語言,其靈活性和易于學(xué)習(xí)的特點(diǎn)使其在科學(xué)計(jì)算、數(shù)據(jù)分析和人工智能等領(lǐng)域變得非常流行。作為Python的用戶,很多時(shí)候你可能需要將數(shù)值類型之間進(jìn)行轉(zhuǎn)換,這樣可以提高你的編程效率。在本文中,我們將介紹Python中數(shù)值互換的知識(shí),并提供一些幫助

    2024年02月09日
    瀏覽(24)
  • 「NTFS:讓你的硬盤更安全、更高效!」NTFS文件系統(tǒng)詳解,

    「NTFS:讓你的硬盤更安全、更高效!」NTFS文件系統(tǒng)詳解,

    NTFS(New Technology File System)是一種現(xiàn)代的文件系統(tǒng),是Windows操作系統(tǒng)中最常用的文件系統(tǒng)之一。它是一種高效、可靠、安全的文件系統(tǒng),支持大容量存儲(chǔ)、文件加密、壓縮、權(quán)限控制等功能。本文將詳細(xì)介紹NTFS文件系統(tǒng)的結(jié)構(gòu)、$Boot文件、$MFT元文件、文件記錄、屬性的屬性

    2024年02月08日
    瀏覽(15)
  • 掌握這5款 Edge插件,讓你的瀏覽器使用更高效!

    掌握這5款 Edge插件,讓你的瀏覽器使用更高效!

    您好,今天我想向您推薦兩款不常用的 Edge 插件,它們可以幫助您更高效地瀏覽網(wǎng)頁和管理標(biāo)簽頁。這些插件可能不像一些常見的插件那樣廣為人知,但它們的功能卻非常實(shí)用。 IHome新標(biāo)簽頁插件 下載地址: https://microsoftedge.microsoft.com/addons/detail/ihome%E5%8E%9Fbdtab%E6%96%B0%E6%A0%

    2024年02月04日
    瀏覽(25)
  • chatgpt賦能python:重新配置PyCharm,讓你的Python編程更加高效

    PyCharm是一個(gè)流行的Python集成開發(fā)環(huán)境,被廣泛用于Python編程。但是,有時(shí)候我們需要重新配置PyCharm以適應(yīng)特定的工作需求或優(yōu)化其性能,這篇文章將討論如何重新配置PyCharm,以便更好地支持Python編程。 首先,我們需要了解PyCharm的配置選項(xiàng),這里我們將重點(diǎn)介紹以下幾個(gè):

    2024年02月12日
    瀏覽(29)
  • 一文讀懂大數(shù)據(jù)工具Phoenix:讓你的數(shù)據(jù)管理更高效!

    一文讀懂大數(shù)據(jù)工具Phoenix:讓你的數(shù)據(jù)管理更高效!

    介紹:Phoenix,最初由saleforce開發(fā)并開源,后成為Apache基金會(huì)的頂級(jí)項(xiàng)目。它是一個(gè)構(gòu)建在HBase上的SQL層,可以使用標(biāo)準(zhǔn)的JDBC APIs而不是HBase客戶端APIs來創(chuàng)建表、插入數(shù)據(jù)和查詢HBase中的數(shù)據(jù)。此外,Phoenix還完全使用Java編寫,作為HBase內(nèi)嵌的JDBC驅(qū)動(dòng),將SQL查詢轉(zhuǎn)換為一個(gè)或多個(gè)

    2024年01月20日
    瀏覽(25)
  • 【實(shí)戰(zhàn)教程】ThinkPHP6分頁功能輕松實(shí)現(xiàn),讓你的網(wǎng)站更高效!

    ThinkPHP是一款非常流行的PHP開發(fā)框架,其最新版本ThinkPHP6在性能和易用性方面都得到了很大的改善。分頁功能是網(wǎng)頁開發(fā)中非常常見的功能,而ThinkPHP6也提供了非常方便的分頁方法。本文將介紹如何實(shí)現(xiàn)ThinkPHP6的分頁功能。 一、了解分頁功能 在Web應(yīng)用程序中,當(dāng)數(shù)據(jù)集非常龐

    2024年01月21日
    瀏覽(21)
  • Nacos 注冊(cè)中心的設(shè)計(jì)原理:讓你的應(yīng)用輕松實(shí)現(xiàn)高效注冊(cè)與發(fā)現(xiàn)!

    Nacos 注冊(cè)中心的設(shè)計(jì)原理:讓你的應(yīng)用輕松實(shí)現(xiàn)高效注冊(cè)與發(fā)現(xiàn)!

    當(dāng)應(yīng)用開始脫離單機(jī)運(yùn)行和訪問時(shí),服務(wù)發(fā)現(xiàn)就誕生了。目前的網(wǎng)絡(luò)架構(gòu)是每個(gè)主機(jī)都有?個(gè)獨(dú)立的 IP 地址,服務(wù)發(fā)現(xiàn)基本都是通過某種方式獲取到服務(wù)所部署的 IP 地址。 DNS 協(xié)議是最早將?個(gè)網(wǎng)絡(luò)名稱翻譯為網(wǎng)絡(luò) IP 的協(xié)議,在最初的架構(gòu)選型中,DNS+LVS+Nginx 基本滿足所有

    2024年02月10日
    瀏覽(21)
  • JAVA Socket實(shí)現(xiàn)實(shí)時(shí)接收TCP消息,讓你的服務(wù)端通信更高效!

    JAVA Socket實(shí)現(xiàn)實(shí)時(shí)接收TCP消息,讓你的服務(wù)端通信更高效!

    本文主要介紹如何利用socket實(shí)現(xiàn)實(shí)時(shí)接收服務(wù)端發(fā)送的TCP消息。 目錄 一、需要掌握 二、程序源碼 三、運(yùn)行演示 網(wǎng)絡(luò)調(diào)試助手下載:https://www.aliyundrive.com/s/6Y8L7Wv5sT6 網(wǎng)絡(luò)通信協(xié)議的理解:JAVA socket是基于TCP/IP協(xié)議實(shí)現(xiàn)的,需要對(duì)TCP/IP協(xié)議有一定的了解,包括TCP連接的建立、數(shù)

    2024年02月11日
    瀏覽(19)
  • 分享7個(gè)漂亮的 JetBrains IDE 代碼主題,讓你的開發(fā)體驗(yàn)更高效愉悅

    分享7個(gè)漂亮的 JetBrains IDE 代碼主題,讓你的開發(fā)體驗(yàn)更高效愉悅

    讓您的 IDE 更漂亮,提高你的工作效率 作為開發(fā)者,我們大部分時(shí)間都花在看IDE上。除了好看外,美觀的IDE還可以提高生產(chǎn)力。 JetBrains是一家專門創(chuàng)建智能開發(fā)工具的尖端軟件供應(yīng)商,包括IntelliJ IDEA,PyCharm,Android Studio等。雖然美觀的定義取決于個(gè)人的觀點(diǎn),但我在這里編

    2024年02月11日
    瀏覽(50)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包