C 為什麼不支援以變數作為陣列長度?有什麼其他辦法,有效率的分配一塊編譯時長度未定的堆疊空間

時間 2021-09-09 12:14:05

1樓:alexsunmiu

難道你們平時不是這麼用的?

剛開始我也還想著。。。什麼可移植性,後來就想開了,微軟能看得起你們這些小平台?少給自己臉上貼金了~

2樓:Starve Jokes

msvc有alloca()

但這個東西自身也是個坑,會導致其他跟棧布局有關的優化失效,不建議盲目使用

至於為什麼不支援,因為歷史原因吧。畢竟不支援的話棧布局可以編譯時確定,編譯器更容易寫。

3樓:

提醒一下有時候大陣列放在棧裡面對於CPU的cache命中率是有嚴重影響的,而且你真的不怕爆棧嗎?

如果真的堅持要這麼用,可以試著用內聯彙編或者外聯彙編這麼做,不過VS2012之後內聯彙編就不支援了。當然你還可以用外聯彙編。

正如另外乙個答案說的,自己寫乙個分配器做這件事,可以用外聯彙編(注意處理器架構)或者用模板或者其他什麼方法。

我不是科班出身,說錯了別黑我。

4樓:

為什麼你會覺得區域性變數訪問速度比堆上的變數快?

同樣都是記憶體,棧又不比堆更優越,為什麼會有棧比堆訪問更快一說?

如果非要強行說一下的話,棧中的變數由於區域性性更好,通常在Cache中的命中率更高。堆中分配的記憶體由於更加的碎片,普遍意義上來講可能Cache命中率更低一些。但是如果對於堆上的一塊記憶體區域重複訪問的話,Cache命中率也會起來。

此外就是堆上的記憶體分配確實會比棧更慢。不必要的記憶體分配也是很多C++程式速度慢的原因。

所以這個東西很依賴於具體的應用場景,而不能簡單的說誰快誰慢的問題,也不應該有這樣的偏見。在不少時候你意識裡面的更慢實際上並不存在,還因為這樣的偏見帶來了其他不必要的花銷。過早優化是萬惡之源啊(大霧

此外棧空間的大小不都是有限制的嗎?難道你可以無限制的從棧上面分配記憶體?

5樓:布客飛龍

1. 對於你的情況,你需要用資料證明放在棧上的確比堆上快,否則老老實實用vector。

2. 你給我設計出來乙個棧上的自增長陣列?

6樓:573xmcgcg

C++為什麼不支援以變數作為陣列長度?因為C++不喜歡C式陣列。https://

isocpp.org/wiki/faq/containers#arrays-are-evil以上鏈結來自【C++超級FAQ】(官方),C++建議在需要使用編譯期無法確定大小的陣列時使用 new。第二個鏈結裡官方也建議使用者使用容器類而不是C式陣列。

我個人並不認為使用 new 分配陣列記憶體是【沒有效率】的。不過C語言的最大優點就是【輕便,靈活】,如果希望對底層有比C++更強大的掌控,那麼還是選C吧。

為什麼C 不支援屬性啊

Patronumme 首先在看別人的回答之前我並不知道C 還有擴充套件可以支援屬性的,學習了。然後考慮這個問題的回答,為什麼不支援啊,因為真的沒必要啊,寫乙個get set函式很麻煩嗎?如果你覺得麻煩,那必然是有許許多多的屬性要新增,既然你都有那麼多屬性了,寫幾個巨集也不麻煩吧?還有實現方法也多種多...

為什麼google protobuf不支援map的序列化和反序列化

雖然現在3.0已經支援,但個人覺得沒有必要。使用map必然會用到更多的空間,使用repeat和屬性名結合完全可以解決map的需求 cswuyg 現在它是支援的。proto2的文件就已經提到了Maps Language Guide 但我用protoc2.6編譯的時候,map關鍵字無法通過編譯,prot...

xbox為什麼不支援vr?

Sunny張亞瑩 大概主要因為XBox是遊戲主機,和VR的套路有點不在一條線上。參加會議的時候聽說過,公司的老大們是這麼想的 VR是很消耗計算能力的,就算你在遊戲裡啥都不幹,光看著介面,它都隨時隨地在給你做定位和渲染,感測器 顯示卡 AI演算法在背後支援你的體驗,非常依賴計算力。所以,高階的VR遊戲...