PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Datentypen und Geschwindigkeit


Einfachkrank
2005-03-30, 17:38:43
Moin,

wo ist der Unterschied zwischen long und int?
Und gibt es Geschwindigkeitsunterschiede beim Verarbeiten von den Datentypen in der CPU? Zum Beispiel: char, int, float, double?

Habe ich direkte Vorteile von meinem AMD Athlon64 bei der Verwendung von __int64 oder LARGE_INTEGER?

MFG Einfachkrank

Ganon
2005-03-30, 17:49:37
Ja, sie belegen ja alle unterschiedlich viel Speicher. Aber hier kommt es auch auf die Optimierung des Compilers drauf an.

Mit 64bit-Programmierung kenne ich mich nicht aus.

Einfachkrank
2005-03-30, 17:57:54
Ich benutze den Microsoft Visual C++ 6.0 Standard Compiler...

Aber gibt es einen Unterschied zwischen Int und Long?

Ganon
2005-03-30, 18:44:32
int = 32bit
long = 64bit

zeckensack
2005-03-30, 18:53:05
int = 32bit
long = 64bitNein. Jedenfalls nicht beim MS-Compiler.
int => 32 bit
long => 32 bit
long long => 64 bit

Einfachkrank
2005-03-30, 19:14:17
Jo, das habe ich auch schon mit dem sizeof Operator festgestellt, deswegen die Frage...

Und kann es sein, dass BOOL Variablen von windef.h schneller als bool von C/C++ her sind??

Hab folgendes Programm schnell mal geschrieben:
# define WIN32_LEAN_AND_MEAN

# include <windows.h>
# include <stdlib.h>
# include <fstream.h>


//-----------------------------------------------------------------------------------------------
BOOL func1(void)
{
BOOL var1, var2;

var1 = TRUE;
var2 = FALSE;

if(var1 == var2) return TRUE;
else return FALSE;
}

bool func2(void)
{
bool var1, var2;

var1 = true;
var2 = false;

if(var1 == var2) return true;
else return false;
}



int main(void)
{
LARGE_INTEGER time, time2, freq;
double tscale;

bool res2;
BOOL res1;

QueryPerformanceFrequency(&freq);
tscale = 1.0 / freq.QuadPart;

// test 1
QueryPerformanceCounter(&time);
for(int i=0; i < 20000; i++)
for(int j=0; j < 10000; j++)
res1 = func1();
QueryPerformanceCounter(&time2);

cout << "Test1: BOOL -> " << tscale * (time2.QuadPart - time.QuadPart) << endl;

// test 2
QueryPerformanceCounter(&time);
for(int k=0; k < 20000; k++)
for(int l=0; l < 10000; l++)
res2 = func2();
QueryPerformanceCounter(&time2);

cout << "Test1: bool -> " << tscale * (time2.QuadPart - time.QuadPart) << endl;

return 0;
}
Und es kam folgendes heraus:
Test1: BOOL -> 4.75983
Test2: bool -> 6.25248

Irgendwie abgefahren!

Trap
2005-03-30, 20:08:33
Ich bekomme mit dem Programm
BOOL -> 0.3506
bool -> 0.3467

Woraus folgt: Dein PC und/oder dein Compiler sind schlechter ;)
Und: Wer misst misst Mist (außer er weiß was er macht)

Einfachkrank
2005-03-30, 21:09:14
Das macht mir Sorgen! Was für einen Compiler hast du? Also das war Debug, im Release ist das ganze auch schneller, aber immer noch über 1 Sekunde :|
Wobei BOOL immer noch schneller als bool war...

Trap
2005-03-30, 21:44:36
Ich habs mit Mingw ausprobiert, mit dem Compiler von MSVC.NET bekomm ich 0.000001 für beide Fälle (beide lassen wohl Teile vom Code weg die nichts machen, der von VC7 etwas mehr).

Einfachkrank
2005-03-30, 21:47:14
Sollte ich mir en neuen Compiler zulegen? *grübel* :)

Trap
2005-03-30, 23:07:02
Compiler ist auf jeden Fall keine schlechte Idee, der von MSVC6 ist nicht gut. Hat sehr viele verschiede Probleme wenn man anfängt templates zu benutzen.

Die IDE von MSVC6 fand ich recht gut. Ich hab allerdings keine Ahnung wie gut oder schlecht man andere Compiler in der IDE einbinden kann.

Du könntest dir legal die Beta von MSVC 2005 runterladen: http://lab.msdn.microsoft.com/vs2005/
Hat mit Sicherheit weniger Fehler als MSVC6...

Ganon
2005-03-30, 23:48:56
Nein. Jedenfalls nicht beim MS-Compiler.
int => 32 bit
long => 32 bit
long long => 64 bit

*andenKopfklatsch*

Mist, stimmt. Das war "long long". ;)

Sorry.

Einfachkrank
2005-03-31, 00:52:42
@Trap - Cool danke!

Als ich eben auf der MS Seite war, habe ich festgestellt, dass es für den MS Visual C++ 6.0 Compiler ja auch Service-Packs gibt :) Bringen die viel in Sachen "Code Generation"?

RoKo
2005-03-31, 00:55:00
sizeof(short) <= sizeof(int) <= sizeof(long)
Wie es genau aussieht, ist Compiler- und Systemspezifisch.
16 - 32 - 64 wäre auf einem AMD64 sicher sinnvoll. Aus Kompatibilitäts- bzw. Geschwindigkeitsgründen belassen die Compiler aber üblicherweise sizeof(long) bei 32.
Wenn man 64Bit-Integer nutzt (üblicherweise long long oder __int64) und das für einen 64Bit-Prozessor kompiliert, sollte was flotteres rauskommen, als wenn man es für einen 32Bit-Prozessor kompiliert. Mit VC6 geht das aber freilich nicht.

Trap
2005-03-31, 01:01:50
Du hast MSVC6 ohne Servicepacks benutzt? Da kann man einige Libs nichtmal mit compilieren.
Ich glaub aber nicht, dass die Servicepacks die Code Generation verbessern.

KiBa
2005-03-31, 01:04:01
noch ne kleine anmerkung, da es in dem thread ja um c++ geht:
es gibt keinen typ "long long" in c++
wenn man wirklich typen braucht, wo die bit-anzahl fest vorgeschrieben ist, würde ich die (u)int#_t typen empfehlen, welche es im c99-standard gibt. den weg in c++ haben die zwar noch nicht gefunden, aber übergangsweise kann man ja die typen gleichen namens aus dem boost namespace nehmen, (welche auch nur typedefs sind). das ganze ist dann relativ portabel und erspart möglicherweise viel ärger.
long würde ich nie nehmen, da es z.b. unter windows immer 32bit ist und unter anderen plattformen häufig länger. mit boost ist man da einigermaßen auf der sicheren seite...