Arbeitsspeicher bestimmen



  • Guten Abend,

    könnt ihr mir weiterhelfen? Wie kann ich den Arebitsspeicher meines Computers bestimmen? Geht das über einen dynamischen Speicher (malloc)?

    Danke



  • Rufe solange malloc(1) in einer Schleife auf, bis malloc NULL liefert.
    Das Ergebnis hat nichts mit dem physisch vorhandenem Speicher deines PC zu tun, deine Frage ist ungenau und konfus.



  • ach so. Aber ich erhalte immer 0, wenn ich das eingebe.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    void *speicher;
    
    do
    {
    	speicher = malloc(1);
    
    }
    while ( malloc==0);
    
    printf("Speicher ist:%f", speicher); 
    
    	  return 0;
    }
    


  • Der Formatspecifier für Zeiger ist %p. %f ist für Fließkommazahlen.

    Allerdings ist dein Programm nutzlos, etweder nur einmal Speicher angefordert wird (dann ist speicher != NULL) oder ewig (dann ist speicher von Anfang an NULL)

    Wutz schrieb:

    Das Ergebnis hat nichts mit dem physisch vorhandenem Speicher deines PC zu tun.

    Du musst eine Funktion vom Betriebssystem aufrufen. Mit Standard C geht das nicht



  • Du solltest betriebssystemabhängige Funktionen nutzen, für Windows bspw. GlobalMemoryStatus.



  • aber warum geht das bei c nicht? gibt es keine andere möglichkeit?



  • MMueller schrieb:

    aber warum geht das bei c nicht? gibt es keine andere möglichkeit?

    Was verstehst du denn unter "Arbeitsspeicher"? Einem (C-)Programm steht nur ein virtueller Speicher zur Verfügung, der nichts mit dem tatsächlich verfügbaren RAM des Computers zu tun hat (Stichwörter virtueller RAM, swapping, paging).
    Beispiel: Ab Windows Vista 64 bit steht einem Programm 8192GB virtueller RAM zu, obwohl der physische RAM längst nicht so groß ist bzw. sein muss. Der theoretische max. Wert von 264(/2?) byte wird im Laufe der Zeit immer weiter ausgeschöpft.
    Du möchtest Informationen über den Computer im Allgemeinen und benötigst daher os-spezifische Funktionen.



  • Windows:

    #ifndef UNICODE
    #define UNICODE
    #endif
    
    #ifndef _UNICODE
    #define _UNICODE
    #endif
    
    #include <locale>
    #include <string>
    #include <iostream>
    
    #define WIN32_LEAN_AND_MEAN
    #define _WIN32_WINNT 0x0501
    #define _WIN32_DCOM
    
    #include <windows.h>
    #include <wchar.h>
    #include <stdio.h>
    #include <conio.h>
    
    #include <objbase.h>
    #pragma comment( lib, "ole32.lib" )
    
    #include <wbemidl.h>
    # pragma comment(lib, "wbemuuid.lib")
    
    template< typename T >
    class de_numpunct : public std::numpunct< T > {
    
    	public:
    		explicit de_numpunct( std::size_t refs = 0 ) : std::numpunct< T >( refs ) { }
    
    	protected:
    
    		virtual char_type do_decimal_point() const { return TEXT( ',' ); }
    		virtual char_type do_thousands_sep() const { return TEXT( '.' ); }
    		virtual std::string do_grouping() const { return "\03"; }
    };
    
    int WINAPI WinMain( HINSTANCE instance, HINSTANCE prev_instance, LPSTR cmd_line, int show_state )
    {
    	AllocConsole();
    
    	std::locale locale( std::locale(), new de_numpunct< wchar_t >() );
    
    	std::wcout.imbue( locale );
    
    	HRESULT result = CoInitializeEx( 0, COINIT_MULTITHREADED );
    
    	if( result != S_OK ) {
    
    		std::wcerr << TEXT( "Failed to initialize COM library. Error code = 0x" ) << std::hex << result << std::endl;
    		_getch();
    
    		CoUninitialize();
    		return EXIT_FAILURE;
    	}
    
    	result = CoInitializeSecurity( nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE, nullptr );
    
    	if( result != S_OK ) {
    
    		std::wcerr << TEXT( "Failed to initialize security. Error code = 0x" ) << std::hex << result << std::endl;
    		_getch();
    
    		CoUninitialize();
    		return EXIT_FAILURE;
    	}
    
    	IWbemLocator *wbem_locator = nullptr;
    
    	result = CoCreateInstance( CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator,
    		reinterpret_cast< void** >( &wbem_locator ) );
    
        if( result != S_OK ) {
    
            std::wcerr << TEXT( "Failed to create IWbemLocator object. Err code = 0x" ) << std::hex << result << std::endl;
    		_getch();
    
    		CoUninitialize();
    		return EXIT_FAILURE;
        }
    
    	IWbemServices *wbem_services = nullptr;
    
    	result = wbem_locator->ConnectServer( TEXT( "ROOT\\CIMV2" ), nullptr, nullptr, nullptr, 0, nullptr, nullptr, &wbem_services );
    
    	if( result != S_OK ) {
    
    		std::wcerr << TEXT( "Could not connect. Error code = 0x" ) << std::hex << result << std::endl;
    		_getch();
    
    		wbem_locator->Release();
    		CoUninitialize();
    		return EXIT_FAILURE;
    	}
    
    	result = CoSetProxyBlanket( wbem_services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE,
    		nullptr, EOAC_NONE );
    
    	if( result != S_OK ) {
    
    		std::wcerr << TEXT( "Could not set proxy blanket. Error code = 0x" ) << std::hex << result << std::endl;
    		_getch();
    
    		wbem_services->Release();
    		wbem_locator->Release();
    		CoUninitialize();
    		return EXIT_SUCCESS;
    	}
    
    	IEnumWbemClassObject* wbem_enumerator = nullptr;
    	result = wbem_services->ExecQuery( TEXT( "WQL" ), TEXT( "SELECT * FROM Win32_PhysicalMemory" ),
    		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, nullptr, &wbem_enumerator );
    
    	if( result != S_OK ) {
    
    		std::wcerr << TEXT( "Query for processes failed. Error code = 0x" ) << std::hex << result << std::endl;
    		_getch();
    
    		wbem_services->Release();
    		wbem_locator->Release();
    		CoUninitialize();
    		return EXIT_SUCCESS;
    
    	} 
    
    	IWbemClassObject *wbem_object;
    	long unsigned returned = 0;
    	long long unsigned memory = 0;
    
    	while( wbem_enumerator ) {
    
    		wbem_enumerator->Next( WBEM_INFINITE, 1, &wbem_object, &returned );
    
    		if( returned != 1 ) break;
    
    		VARIANT prop;
    
    		wbem_object->Get( TEXT( "DeviceLocator" ), 0, &prop, 0, 0 );
    		std::wcout << prop.bstrVal;
    
    		wbem_object->Get( TEXT( "Capacity" ), 0, &prop, 0, 0 );
    
    		long long unsigned capacity = 0;
    		swscanf( prop.bstrVal, TEXT("%I64d"), &capacity );
    
    		std::wcout << TEXT( ": " ) << capacity << TEXT( " bytes " ) << std::endl;
    
    		memory += ( capacity / 1024. / 1024. );
    
    		VariantClear( &prop );
    		wbem_object->Release();
    	}     
    
    	std::wcout << TEXT( "\nTotal Memory: " ) << memory << TEXT( " MiB\n" ) << std::endl;
    
    	_getch();
    
    	wbem_services->Release();
    	wbem_locator->Release();
    	CoUninitialize();
    
    	return EXIT_SUCCESS;
    }
    

    //edit: aufräumen vergessen.



  • Netter Code, aber ich denke nicht dass C weiss was nen Template ist 😛



  • C/Linux:

    #include <stdlib.h>
    #include <stdio.h>
    
    int
    main(void)
    {
            FILE *f;                                                                                                                                    
            int c;
    
            f = fopen("/proc/meminfo", "r");
            if (f == NULL)
                    exit(1);
    
            while ((c = fgetc(f)) != EOF && c != '\n')
                    putchar(c);
    
            putchar('\n');
            fclose(f);
    
            return 0;
    }
    

Anmelden zum Antworten