簡體   English   中英

如何防止聲明為局部變量的對象在堆棧中分配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM