我想知道是否有辦法從Ada泛型中獲得更小/更高效的彙編代碼。Ada泛型和彙編代碼生成
例如,我已經寫了一個小假的Ada程序(main.adb)顯示&實例化它的6倍通用過程:,我使用gnatmake main.adb
with Ada.Text_Io;
procedure Main is
generic
X : Natural;
with procedure Bob (S : in String);
procedure Thing_Gen (S : in String);
procedure Thing_Gen (S : in String) is
begin
for I in 0 .. X loop
Bob (Natural'Image (I) & " " & S);
end loop;
end Thing_Gen;
procedure Alice (S : in String) is
begin
Ada.Text_Io.Put_Line ("Alice:" & S);
end Alice;
procedure Aaa is new Thing_Gen (X => 1, Bob => Alice);
procedure Baa is new Thing_Gen (X => 2, Bob => Alice);
procedure Caa is new Thing_Gen (X => 3, Bob => Alice);
procedure Daa is new Thing_Gen (X => 4, Bob => Alice);
procedure Eaa is new Thing_Gen (X => 5, Bob => Alice);
procedure Faa is new Thing_Gen (X => 6, Bob => Alice);
begin
Aaa("A");
Baa("B");
Caa("C");
Daa("D");
Eaa("E");
Faa("F");
end Main;
編譯的時候我看導致objdump -d -S main > main.dump
我看到有6款爲每個通用實例化:
000000000040275f <main__baa.2182>:
40275f: 55 push %rbp
402760: 48 89 e5 mov %rsp,%rbp
... <剪斷>
0000000000402a05 <main__caa.2187>:
402a05: 55 push %rbp
402a06: 48 89 e5 mov %rsp,%rbp
... <剪斷> 等等
每個具有非常相似的代碼,所以我懷疑的情況是,gnatmake使用Thing_Gen
爲模板,擴大代碼爲每個實例,而爲比重用一些參數的代碼。
所以問題是,如何讓gnatmake重用泛型的代碼,而不是爲每個實例化複製/粘貼?
我本來期望的實例已經採取的一種形式:
- 設置巴阿/應用泛型參數(我知道
X
是有This_Value
&程序Bob
是This_Address
) - 呼叫
Thing_Gen
(然後使用設置來產生預期結果的 )
導致重新使用Thing_Gen
代碼。但這似乎並非如此。解釋爲什麼我在彙編中是個菜鳥&編譯器問題也歡迎!
注意:同樣的結果Sparc & Intel! (英特爾gnatmake版本4.4.3)
您使用過哪些編譯器標誌? – 2012-08-15 09:35:11
@ChristianForler無。完整的命令是提供'gnatmake main.adb' – NWS 2012-08-15 10:32:24
(Upvoted讓你超過1000,享受你的新特權。嗚嗚!:-) – 2012-08-16 11:48:11