Wie kann man dafür sorgen, dass C++ genauso speichersparend ist wie C und trotzdem STL verwendet?C++

Programme in C++. Entwicklerforum
Guest
 Wie kann man dafür sorgen, dass C++ genauso speichersparend ist wie C und trotzdem STL verwendet?

Post by Guest »

Diese C- und C++-Programme sind äquivalent:
"loop.c":

Code: Select all

#include 
#include 
#include 

const int N = 1024*4;

int main(void) {

double* v = malloc(N * sizeof(double));

for(int i = 0; i < N; i++)
v[i] = sin(i);

double sum = 0;

for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
for(int k = 0; k < N; k++)
sum += v[i] + 2 * v[j] + 3 * v[k];

printf("sum = %f\n", sum);

free(v);
}
"loop.cpp":

Code: Select all

#include 
#include 
#include 

const int N = 1024 * 4;

int main() {
std::vector v(N);

for(int i = 0; i < N; i++)
v[i] = sin(i);

double sum = 0;

for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
for(int k = 0; k < N; k++)
sum += v[i] + 2 * v[j] + 3 * v[k];

printf("sum = %f\n", sum);
}
Aber wenn ich sie auf meinem System ausführe (kompiliert mit gcc -O2 -lm und g++ -O2 -fno-Exceptions), verwendet die C-Version 800 KB , während die C++-Version 1600 KB verwendet und manchmal in der Mitte der Ausführung auf 3300 KB springt – ich habe nicht bemerkt, dass die C-Version dies tut (ich sehe oben „RES“, während das Programm ausgeführt wird)
Ich frage mich, ob es eine Compiler-Einstellung, eine Umgebungsvariable oder etwas anderes gibt, das dafür sorgen könnte, dass die C++-Version genauso speichersparend ist wie ihr C-Äquivalent, while Ich verwende immer noch STL (

Code: Select all

std::vector
, speziell)?
Ich hoffe, dass es eine solche Einstellung gibt, denn eines der Designprinzipien von C++ ist:

Was Sie nicht nutzen, bezahlen Sie nicht (zeitlich oder räumlich) und außerdem: Was Sie nutzen, können Sie nicht besser per Hand programmieren.

Um die Frage fokussiert zu halten: Ich bin nicht daran interessiert, zu einer Alternative zu wechseln libstdc++-Implementierungen, aber ich kann Clang anstelle von GCC verwenden, wenn das hilft.

Update: Das habe ich getan Noch etwas experimentieren:
"run.sh":

Code: Select all

for i in `seq 1000`; do
nice ./a.out &
done
gefolgt von

Code: Select all

$ killall a.out
und schaute, wie sich die Gesamtspeichernutzung änderte. Und es ist in der Tat so, wie einige Kommentatoren andeuteten, dass der Overhead größtenteils von den Prozessen geteilt wird, obwohl er immer noch vorhanden ist, auch pro Prozess: Die Speichernutzung pro Prozess beträgt 200 KB und 250 KB für C und C++-Versionen bzw. code> hat kaum oder gar keine Auswirkung. Der Overhead entsteht hier durch die Verwendung von C++ anstelle von vector.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post