Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
D3D12_COMPARISON_FUNC Map(const CompareOp compareOp) { switch (compareOp) { case CompareOp::Never: return D3D12_COMPARISON_FUNC_NEVER; case CompareOp::Less: return D3D12_COMPARISON_FUNC_LESS; case CompareOp::Equal: return D3D12_COMPARISON_FUNC_EQUAL; case CompareOp::LessEqual: return D3D12_COMPARISON_FUNC_LESS_EQUAL; case CompareOp::Greater: return D3D12_COMPARISON_FUNC_GREATER; case CompareOp::NotEqual: return D3D12_COMPARISON_FUNC_NOT_EQUAL; case CompareOp::GreaterEqual: return D3D12_COMPARISON_FUNC_GREATER_EQUAL; case CompareOp::Ever: return D3D12_COMPARISON_FUNC_ALWAYS; } MapFailed("CompareOp", "D3D12_COMPARISON_FUNC"); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static const D3D12_COMPARISON_FUNC compareOpMap[] = { D3D12_COMPARISON_FUNC_NEVER, D3D12_COMPARISON_FUNC_LESS, D3D12_COMPARISON_FUNC_EQUAL, D3D12_COMPARISON_FUNC_LESS_EQUAL, D3D12_COMPARISON_FUNC_GREATER, D3D12_COMPARISON_FUNC_NOT_EQUAL, D3D12_COMPARISON_FUNC_GREATER_EQUAL, D3D12_COMPARISON_FUNC_ALWAYS, }; D3D12_COMPARISON_FUNC Map(const CompareOp compareOp) { if (compareOp < CompareOp::Never || compareOp > CompareOp::Ever) MapFailed("CompareOp", "D3D12_COMPARISON_FUNC"); return compareOpMap[static_cast<int>(compareOp) - static_cast<int>(CompareOp::Never)]; } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
; 270 : case CompareOp::Less: return D3D12_COMPARISON_FUNC_LESS; mov eax, 2 jmp SHORT $LN1@Map $LN6@Map: ; 271 : case CompareOp::Equal: return D3D12_COMPARISON_FUNC_EQUAL; mov eax, 3 jmp SHORT $LN1@Map $LN7@Map: ; 272 : case CompareOp::LessEqual: return D3D12_COMPARISON_FUNC_LESS_EQUAL; mov eax, 4 jmp SHORT $LN1@Map $LN8@Map: ; 273 : case CompareOp::Greater: return D3D12_COMPARISON_FUNC_GREATER; mov eax, 5 jmp SHORT $LN1@Map $LN9@Map: |
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Sprünge sind ja nicht gerade Performant, oder ist das bei unbedingten Sprüngen relativ egal?
Mir erscheint ein festangelegtes Array jedenfalls immer noch effizienter zu sein.
Instruktionen stehen ja auch im Speicher und müssen dort geholt werden. Aber wenigstens ist es so näher zusammen. Allgemeine Aussagen lassen sich aber ehh nicht treffen.Da wäre ich mir mal nicht so sicher; bedenke, dass die Lösung per Jumptable das Ergebnis aus dem Speicher lesen muss, während die hier vom Compiler implementierte Lösung das Ergebnis direkt in der Instruction ablegt...
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
int main() { volatile int blub = 18; switch (blub) { case 1: return 1*1; case 2: return 2*2; case 3: return 3*3; case 4: return 4*4; case 5: return 5*5; case 6: return 6*6; } return 0; } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (12.09.2016, 12:54)
Quellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 _TEXT SEGMENT compareOp$ = 48 ?MapSwitch@@YA?AW4D3D12_COMPARISON_FUNC@@W4CompareOp@@@Z PROC ; MapSwitch, COMDAT ; 50 : { $LN16: 00000 48 83 ec 28 sub rsp, 40 ; 00000028H ; 51 : switch (compareOp) 00004 83 f9 07 cmp ecx, 7 00007 77 66 ja SHORT $LN15@MapSwitch 00009 48 63 c1 movsxd rax, ecx 0000c 48 8d 15 00 00 00 00 lea rdx, OFFSET FLAT:__ImageBase 00013 8b 8c 82 00 00 00 00 mov ecx, DWORD PTR $LN13@MapSwitch[rdx+rax*4] 0001a 48 03 ca add rcx, rdx 0001d ff e1 jmp rcx $LN4@MapSwitch: ; 52 : { ; 53 : case CompareOp::Never: return D3D12_COMPARISON_FUNC_NEVER; 0001f b8 01 00 00 00 mov eax, 1 ; 63 : } 00024 48 83 c4 28 add rsp, 40 ; 00000028H 00028 c3 ret 0 $LN5@MapSwitch: ; 54 : case CompareOp::Less: return D3D12_COMPARISON_FUNC_LESS; 00029 b8 02 00 00 00 mov eax, 2 ; 63 : } 0002e 48 83 c4 28 add rsp, 40 ; 00000028H 00032 c3 ret 0 $LN6@MapSwitch: ; 55 : case CompareOp::Equal: return D3D12_COMPARISON_FUNC_EQUAL; 00033 b8 03 00 00 00 mov eax, 3 ; 63 : } 00038 48 83 c4 28 add rsp, 40 ; 00000028H 0003c c3 ret 0 $LN7@MapSwitch: ; 56 : case CompareOp::LessEqual: return D3D12_COMPARISON_FUNC_LESS_EQUAL; 0003d b8 04 00 00 00 mov eax, 4 ; 63 : } 00042 48 83 c4 28 add rsp, 40 ; 00000028H 00046 c3 ret 0 $LN8@MapSwitch: ; 57 : case CompareOp::Greater: return D3D12_COMPARISON_FUNC_GREATER; 00047 b8 05 00 00 00 mov eax, 5 ; 63 : } 0004c 48 83 c4 28 add rsp, 40 ; 00000028H 00050 c3 ret 0 $LN9@MapSwitch: ; 58 : case CompareOp::NotEqual: return D3D12_COMPARISON_FUNC_NOT_EQUAL; 00051 b8 06 00 00 00 mov eax, 6 ; 63 : } 00056 48 83 c4 28 add rsp, 40 ; 00000028H 0005a c3 ret 0 $LN10@MapSwitch: ; 59 : case CompareOp::GreaterEqual: return D3D12_COMPARISON_FUNC_GREATER_EQUAL; 0005b b8 07 00 00 00 mov eax, 7 ; 63 : } 00060 48 83 c4 28 add rsp, 40 ; 00000028H 00064 c3 ret 0 $LN11@MapSwitch: ; 60 : case CompareOp::Ever: return D3D12_COMPARISON_FUNC_ALWAYS; 00065 b8 08 00 00 00 mov eax, 8 ; 63 : } 0006a 48 83 c4 28 add rsp, 40 ; 00000028H 0006e c3 ret 0 $LN15@MapSwitch: ; 61 : } ; 62 : MapFailed("CompareOp", "D3D12_COMPARISON_FUNC"); 0006f 48 8d 15 00 00 00 00 lea rdx, OFFSET FLAT:??_C@_0BG@FCJHIDFD@D3D12_COMPARISON_FUNC?$AA@ 00076 48 8d 0d 00 00 00 00 lea rcx, OFFSET FLAT:??_C@_09FFBPNLHE@CompareOp?$AA@ 0007d e8 00 00 00 00 call ?MapFailed@@YAXPEBD0@Z ; MapFailed 00082 cc int 3 $LN14@MapSwitch: 00083 90 npad 1 $LN13@MapSwitch: ; 63 : } 00084 00 00 00 00 DD $LN4@MapSwitch 00088 00 00 00 00 DD $LN5@MapSwitch 0008c 00 00 00 00 DD $LN6@MapSwitch 00090 00 00 00 00 DD $LN7@MapSwitch 00094 00 00 00 00 DD $LN8@MapSwitch 00098 00 00 00 00 DD $LN9@MapSwitch 0009c 00 00 00 00 DD $LN10@MapSwitch 000a0 00 00 00 00 DD $LN11@MapSwitch ?MapSwitch@@YA?AW4D3D12_COMPARISON_FUNC@@W4CompareOp@@@Z ENDP ; MapSwitch _TEXT ENDS
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Spiele Programmierer« (12.09.2016, 15:34)
Der Einwand von Dot ist nicht zutreffend, weil der Compiler auch hier eine Tabelle anlegt.
Eine Wertetabelle ist in dem Fall effizienter, weil es keinen Control Flow benötigt und dadurch keine Pipeline Stalls verursacht.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (12.09.2016, 15:22)
Werbeanzeige