VC11 hier.
Krishty hat geschrieben:Dass __declspec(restrict noalias) keine Wirkung hat, wusste ich ja; aber dass __restrict ebenfalls wirkungslos ist, nicht. Danke, dass das nirgendwo erwähnt ist, und man immer erst 400 Funktionsparameter damit dekorieren muss um zu merken, dass sich das Kompilat dadurch nie ändert. Dass ich nicht
void __declspec(fucks_given(0)) foo(int * __because_fuck_you preciousPointer)
schreiben muss, ist alles. Dazu auch im Punkt hierdrüber das Stichwort Aliasing suchen.
Ich habe mal
das Beispiel aus der MSDN genommen und durch VC11 gejagt:
Code: Alles auswählen
void __declspec(dllexport) sum1(int n, int * a, int * b, int * c, int * d)
{
int i;
for (i = 0; i < n; i++) {
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
}
}
void __declspec(dllexport) sum1(int n, int * a, int * b, int * c, int * d)
{
003F1270 push ebp
003F1271 mov ebp,esp
003F1273 sub esp,0Ch
int i;
for (i = 0; i < n; i++) {
003F1276 xor ecx,ecx
003F1278 push esi
003F1279 mov esi,dword ptr [n]
003F127C test esi,esi
003F127E jle sum1+14Ch (03F13BCh)
003F1284 push ebx
003F1285 mov ebx,dword ptr [a]
003F1288 push edi
003F1289 mov edi,dword ptr [c]
003F128C cmp esi,4
003F128F jb sum1+116h (03F1386h)
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
003F1295 mov ecx,dword ptr [d]
003F1298 mov eax,edi
003F129A sub eax,ecx
003F129C cdq
003F129D xor eax,edx
003F129F sub eax,edx
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
003F12A1 lea edx,[esi*4-4]
003F12A8 cmp eax,edx
003F12AA jle sum1+155h (03F13C5h)
003F12B0 mov eax,edi
003F12B2 sub eax,dword ptr [b]
003F12B5 cdq
003F12B6 xor eax,edx
003F12B8 sub eax,edx
003F12BA lea edx,[esi*4-4]
003F12C1 cmp eax,edx
003F12C3 jle sum1+155h (03F13C5h)
003F12C9 mov eax,edi
003F12CB sub eax,ebx
003F12CD cdq
003F12CE xor eax,edx
003F12D0 sub eax,edx
003F12D2 lea edx,[esi*4-4]
003F12D9 cmp eax,edx
003F12DB jle sum1+155h (03F13C5h)
003F12E1 mov eax,ebx
003F12E3 sub eax,ecx
003F12E5 cdq
003F12E6 xor eax,edx
003F12E8 sub eax,edx
003F12EA lea ecx,[esi*4-4]
003F12F1 cmp eax,ecx
003F12F3 jle sum1+151h (03F13C1h)
003F12F9 mov ecx,dword ptr [b]
003F12FC mov eax,ebx
003F12FE sub eax,ecx
003F1300 cdq
003F1301 xor eax,edx
003F1303 sub eax,edx
003F1305 lea edx,[esi*4-4]
003F130C cmp eax,edx
003F130E jle sum1+151h (03F13C1h)
003F1314 mov eax,esi
003F1316 and eax,80000003h
003F131B jns sum1+0B2h (03F1322h)
003F131D dec eax
003F131E or eax,0FFFFFFFCh
003F1321 inc eax
}
003F1322 sub ecx,edi
003F1324 mov edx,esi
003F1326 sub edx,eax
003F1328 mov dword ptr [ebp-4],ecx
003F132B mov ecx,dword ptr [d]
003F132E mov dword ptr [ebp-0Ch],edx
003F1331 mov edx,ebx
003F1333 sub edx,edi
003F1335 sub ecx,edi
003F1337 mov dword ptr [ebp-8],ecx
003F133A mov eax,edi
003F133C mov edi,dword ptr [ebp-4]
003F133F mov ebx,edx
003F1341 mov edx,dword ptr [ebp-8]
003F1344 xor ecx,ecx
003F1346 jmp sum1+0E0h (03F1350h)
003F1348 lea esp,[esp]
003F134F nop
a[i] = b[i] + c[i];
003F1350 movdqu xmm0,xmmword ptr [eax]
a[i] = b[i] + c[i];
003F1354 movdqu xmm1,xmmword ptr [edi+eax]
003F1359 add ecx,4
003F135C paddd xmm1,xmm0
003F1360 movdqu xmmword ptr [ebx+eax],xmm1
c[i] = b[i] + d[i];
003F1365 movdqu xmm1,xmmword ptr [edx+eax]
003F136A movdqu xmm0,xmmword ptr [edi+eax]
003F136F lea eax,[eax+10h]
003F1372 paddd xmm1,xmm0
003F1376 movdqu xmmword ptr [eax-10h],xmm1
003F137B cmp ecx,dword ptr [ebp-0Ch]
003F137E jl sum1+0E0h (03F1350h)
003F1380 mov edi,dword ptr [c]
003F1383 mov ebx,dword ptr [a]
003F1386 mov edx,dword ptr [d]
}
003F1389 cmp ecx,esi
003F138B jge sum1+14Ah (03F13BAh)
003F138D mov eax,dword ptr [b]
003F1390 sub ebx,dword ptr [b]
003F1393 sub edx,dword ptr [b]
003F1396 sub edi,dword ptr [b]
003F1399 lea eax,[eax+ecx*4]
003F139C sub esi,ecx
003F139E mov edi,edi
a[i] = b[i] + c[i];
003F13A0 mov ecx,dword ptr [eax]
003F13A2 add ecx,dword ptr [eax+edi]
003F13A5 lea eax,[eax+4]
003F13A8 mov dword ptr [eax+ebx-4],ecx
c[i] = b[i] + d[i];
003F13AC mov ecx,dword ptr [edx+eax-4]
003F13B0 add ecx,dword ptr [eax-4]
003F13B3 mov dword ptr [eax+edi-4],ecx
003F13B7 dec esi
003F13B8 jne sum1+130h (03F13A0h)
003F13BA pop edi
003F13BB pop ebx
003F13BC pop esi
}
}
003F13BD mov esp,ebp
003F13BF pop ebp
003F13C0 ret
und
Code: Alles auswählen
void __declspec(dllexport) sum2(int n, int * __restrict a, int * __restrict b, int * c, int * d)
{
int i;
for (i = 0; i < n; i++) {
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
}
}
void __declspec(dllexport) sum2(int n, int * __restrict a, int * __restrict b, int * c, int * d)
{
003F13D0 push ebp
003F13D1 mov ebp,esp
003F13D3 sub esp,0Ch
int i;
for (i = 0; i < n; i++) {
003F13D6 xor ecx,ecx
003F13D8 push esi
003F13D9 mov esi,dword ptr [n]
003F13DC test esi,esi
003F13DE jle sum2+13Fh (03F150Fh)
003F13E4 push ebx
003F13E5 mov ebx,dword ptr [a]
003F13E8 push edi
003F13E9 mov edi,dword ptr [c]
003F13EC cmp esi,4
003F13EF jb sum2+101h (03F14D1h)
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
003F13F5 mov eax,edi
003F13F7 sub eax,dword ptr [d]
003F13FA cdq
003F13FB xor eax,edx
003F13FD sub eax,edx
003F13FF lea edx,[esi*4-4]
003F1406 cmp eax,edx
003F1408 jle sum2+101h (03F14D1h)
003F140E mov eax,edi
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
003F1410 sub eax,dword ptr [b]
003F1413 cdq
003F1414 xor eax,edx
003F1416 sub eax,edx
003F1418 lea edx,[esi*4-4]
003F141F cmp eax,edx
003F1421 jle sum2+101h (03F14D1h)
003F1427 mov eax,edi
003F1429 sub eax,ebx
003F142B cdq
003F142C xor eax,edx
003F142E sub eax,edx
003F1430 lea edx,[esi*4-4]
003F1437 cmp eax,edx
003F1439 jle sum2+101h (03F14D1h)
003F143F mov eax,ebx
003F1441 sub eax,dword ptr [d]
003F1444 cdq
003F1445 xor eax,edx
003F1447 sub eax,edx
003F1449 lea edx,[esi*4-4]
003F1450 cmp eax,edx
003F1452 jle sum2+101h (03F14D1h)
003F1458 mov eax,ebx
003F145A sub eax,dword ptr [b]
003F145D cdq
003F145E xor eax,edx
003F1460 sub eax,edx
003F1462 lea edx,[esi*4-4]
003F1469 cmp eax,edx
003F146B jle sum2+101h (03F14D1h)
003F146D mov eax,esi
003F146F and eax,80000003h
003F1474 jns sum2+0ABh (03F147Bh)
003F1476 dec eax
003F1477 or eax,0FFFFFFFCh
003F147A inc eax
003F147B mov edx,esi
003F147D sub edx,eax
003F147F mov dword ptr [ebp-0Ch],edx
}
003F1482 mov edx,ebx
}
003F1484 mov ebx,dword ptr [d]
003F1487 sub edx,edi
003F1489 mov dword ptr [n],edx
003F148C mov edx,dword ptr [b]
003F148F sub edx,edi
003F1491 sub ebx,edi
003F1493 mov dword ptr [ebp-8],ebx
003F1496 mov ebx,dword ptr [n]
003F1499 mov eax,edi
003F149B mov edi,edx
003F149D mov edx,dword ptr [ebp-8]
a[i] = b[i] + c[i];
003F14A0 movdqu xmm1,xmmword ptr [edi+eax]
003F14A5 movdqu xmm0,xmmword ptr [eax]
003F14A9 add ecx,4
003F14AC paddd xmm0,xmm1
003F14B0 movdqu xmmword ptr [ebx+eax],xmm0
c[i] = b[i] + d[i];
003F14B5 movdqu xmm0,xmmword ptr [edx+eax]
003F14BA lea eax,[eax+10h]
003F14BD paddd xmm0,xmm1
003F14C1 movdqu xmmword ptr [eax-10h],xmm0
003F14C6 cmp ecx,dword ptr [ebp-0Ch]
003F14C9 jl sum2+0D0h (03F14A0h)
003F14CB mov edi,dword ptr [c]
003F14CE mov ebx,dword ptr [a]
003F14D1 mov edx,dword ptr [d]
}
003F14D4 cmp ecx,esi
003F14D6 jge sum2+13Dh (03F150Dh)
003F14D8 sub edx,dword ptr [b]
003F14DB mov eax,dword ptr [b]
003F14DE sub ebx,dword ptr [b]
003F14E1 sub edi,dword ptr [b]
003F14E4 lea eax,[eax+ecx*4]
003F14E7 mov dword ptr [d],edx
003F14EA sub esi,ecx
003F14EC lea esp,[esp]
a[i] = b[i] + c[i];
003F14F0 mov ecx,dword ptr [eax+edi]
003F14F3 add ecx,dword ptr [eax]
003F14F5 lea eax,[eax+4]
003F14F8 mov dword ptr [eax+ebx-4],ecx
c[i] = b[i] + d[i];
003F14FC mov ecx,dword ptr [d]
c[i] = b[i] + d[i];
003F14FF mov ecx,dword ptr [ecx+eax-4]
003F1503 add ecx,dword ptr [eax-4]
003F1506 mov dword ptr [eax+edi-4],ecx
003F150A dec esi
003F150B jne sum2+120h (03F14F0h)
003F150D pop edi
003F150E pop ebx
003F150F pop esi
}
}
003F1510 mov esp,ebp
003F1512 pop ebp
003F1513 ret
Es kommen also durchaus minimal unterschiedliche Kompilate raus. Schmeiße ich aber das
__declspec(dllexport) raus, so schmeißt VC11 einfach
sum2 weg, und ersetzt den Aufruf durch einen Aufruf von
sum1.
Kristhy hat geschrieben:In IntelliSense ist die Deklaration von operator new hard-codet. Ändert man den Parameter zu einem typedef auf size_t, meckert er, dass nur size_t ein gültiger Parameter sein dürfe. (Vielleicht ist das vom Standard her ja tatsächlich so; mir erscheint es aber idiotisch.)
Kann ich gerade weder mit VC 2010 noch VC11 nachvollziehen.
Krishty hat geschrieben:IntelliSense akzeptiert eine Aufreihung von __declspec-Parametern (z.B. __declspec(noinline noreturn)) nur, wenn die Eigenschaften durch Kommas getrennt sind; obwohl die MSDN ausdrücklich sagt, dass es nur Leerraum sein darf. Der Compiler schluckt beides.
Wenn du damit meinst, dass IntelliSense das Syntaxhighlighting beim
noreturn verhaut, und es mit Komma funktioniert, dann kann ich den Fehler unter VC11 bestätigen. Der IntelliSense-Compiler gibt aber keine Fehlermeldung.