[英]How to prevent objects declared as local variables from being allocated in the stack?
在使用ARM / Keil編譯器為小型ARM處理器編譯C ++時,我在解決以下性能問題。
在執行一些處理的函數中,我具有以下結構的代碼:
{
MyClass temp = global_variable_input;
Operation 1 on temp;
Operation 2 on temp;
...
Operation N on temp;
global_variable_output = temp;
}
MyClass用於對數學對象進行建模,唯一的成員是32位整數(即,對象的完整大小為4個字節)。
所有操作都涉及使用重載運算符或MyClass方法,並因此更改'temp'的值。 有些操作是微不足道的並且是內聯的(在類中聲明為inline的方法),而另一些操作則更為復雜,需要生成對該方法的調用。
在查看由編譯器為我的例程生成的匯編代碼后,我注意到編譯器為堆棧中的“ temp”分配了空間,並且每個單個操作(也包括內聯的!)都將操作結果存儲在該位置中。堆棧,然后繼續使用上一次操作中存儲在寄存器中的值。 對於非內聯變量,編譯器將指針傳遞到寄存器r1中的對象(this),並傳遞指針到在堆棧中創建的另一個對象以將結果存儲在寄存器r0中。
該代碼實現了一種信號處理算法,您可以將其想象為針對temp的一系列算術運算,因此,在每個單個操作(可能只是一個操作碼)之后使用此附加的“ store”指令以及相應的內存訪問會引入大量的執行中的性能損失。
理想情況下,我希望編譯器僅使用寄存器來完成操作,而不是保留每次操作后都需要更新的“ temp”的堆疊版本。
另一個希望是,它可以簡單地使用寄存器將對象的當前值傳遞給方法(如ARM C調用約定為常規C函數指定的那樣)並以相同的方式獲取結果,而不是使用指向內存位置的指針。
我要求太多嗎? 如何使我的ARM / Keil編譯器以這種方式工作?
PS:該函數非常簡單,因此它不像編譯器需要在堆棧中分配我的變量,因為它用完了寄存器。 我懷疑這樣做的原因是,感覺到需要有一個指針傳遞給非內聯方法,然后認為有必要使堆棧中的值始終保持最新。
非常感謝!
使用類似的參考
MyClass& temp = global_variable_input;
會避免在堆棧(本地存儲)上分配MyClass
的完整副本
雖然任何
Operation 1 on temp;
Operation 2 on temp;
// ...
也會影響原始的global_variable_input
。
您可以將類更改為結構。 它將存儲在堆棧而不是堆中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.