第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

字符串文字的C優(yōu)化

字符串文字的C優(yōu)化

C
天涯盡頭無女友 2019-11-19 15:13:09
剛剛在gdb中檢查了以下內(nèi)容:char *a[] = {"one","two","three","four"};char *b[] = {"one","two","three","four"};char *c[] = {"two","three","four","five"};char *d[] = {"one","three","four","six"};我得到以下內(nèi)容:(gdb) p a$17 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}(gdb) p b$18 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}(gdb) p c$19 = {0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four", 0x80961b7 "five"}(gdb) p d$20 = {0x80961a4 "one", 0x80961ac "three", 0x80961b2 "four", 0x80961bc "six"}等效詞的字符串指針是相同的,我感到非常驚訝。我本以為每個(gè)字符串都會(huì)在堆棧上分配自己的內(nèi)存,而不管它是否與另一個(gè)數(shù)組中的字符串相同。這是某種編譯器優(yōu)化的示例,還是這種字符串聲明的標(biāo)準(zhǔn)行為?
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊

它稱為“字符串池”。在Microsoft編譯器中是可選的,但在GCC中則不是。如果關(guān)閉MSVC中的字符串池,則不同陣列中的“相同”字符串將被復(fù)制,并且具有不同的內(nèi)存地址,因此將占用額外(不必要)的50字節(jié)左右的靜態(tài)數(shù)據(jù)字節(jié)。


編輯:v 4.0之前的gcc有一個(gè)選項(xiàng),-fwritable-strings該選項(xiàng)禁用了字符串池。此選項(xiàng)的作用是雙重的:它允許覆蓋字符串文字,并禁用字符串池。因此,在您的代碼中,設(shè)置此標(biāo)志將允許有些危險(xiǎn)的代碼


/* Overwrite the first string in a, so that it reads 'xne'.  Does not */ 

/* affect the instances of the string "one" in b or d */

*a[0] = 'x';


查看完整回答
反對 回復(fù) 2019-11-19
?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

(我假設(shè)你a,b,c并d聲明為局部變量,這是你的籌碼相關(guān)預(yù)期的原因。)


C中的字符串文字具有靜態(tài)存儲(chǔ)持續(xù)時(shí)間。它們永遠(yuǎn)不會(huì)被“分配”在棧上。它們始終分配在全局/靜態(tài)存儲(chǔ)器中,并且“永遠(yuǎn)存在”,即只要程序運(yùn)行即可。


您a,b,c和d數(shù)組被分配在堆棧中。存儲(chǔ)在這些數(shù)組中的指針指向靜態(tài)內(nèi)存。在這種情況下,相同單詞的指針相同并沒有什么異常。


編譯器是否將相同的文字合并為一個(gè)取決于編譯器。一些編譯器甚至具有控制此行為的選項(xiàng)。字符串文字始終是只讀的(這就是為什么最好const char *在數(shù)組中使用類型的原因),因此,在您開始依賴實(shí)際指針值之前,是否合并它們不會(huì)有太大的區(qū)別。


PS只是出于好奇:即使將這些字符串文字分配在堆棧上,您為什么也希望相同的文字多次被“實(shí)例化”?


查看完整回答
反對 回復(fù) 2019-11-19
?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

據(jù)我所知,對同一字符串文字的兩個(gè)(或更多)引用必須解析為相同的內(nèi)存位置。即使有些是“重復(fù)的”,編譯器也可以(有些確實(shí))為每個(gè)字符串文字分配存儲(chǔ)空間。

查看完整回答
反對 回復(fù) 2019-11-19
  • 3 回答
  • 0 關(guān)注
  • 495 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號