为什么Linux VmSize VmData比代码估计的还要大?

时间:2019-03-02 09:47:13

标签: c linux gcc memory

我想知道代码运行时将占用多少内存。 我总结了代码中使用的所有内存,并使用GCC转换为可执行的bin文件。

当我运行bin文件并使用cat/proc/$PID/status时,VmSize VmData比预期的要大得多。即使删除所有代码但仅休眠,结果仍然相同,

VmPeak:    12816 kB
VmSize:    12816 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:       964 kB
VmRSS:       964 kB
VmData:      204 kB
VmStk:       136 kB
VmExe:        56 kB
VmLib:      2100 kB
VmPTE:        48 kB
VmPMD:        12 kB
VmSwap:        0 kB
  • 为什么即使我的代码中没有数据,内存也是如此大?我用代码估算的数据最多应为40K,但VmData为204K,更大……
  • 无论我是否在代码中添加#if 0,为什么VmData相同?为什么添加时不更改较小?我认为至少应该小30K ...
  • 如何获得我的代码正在使用的内存?还有其他测试方法吗?
#include <stdio.h>


int main()
{
    #if 0 
    extern int ed25519_getpub(unsigned char* public_key, const unsigned char* private_key);
    extern int ed25519_sign(unsigned char* signature,
                    const unsigned char* private_key,
                    const unsigned char* msg, const unsigned long msg_len); // use a large static global 30K array
    extern int ed25519_verify(const unsigned char* signature,
                      const unsigned char* public_key,
                      const unsigned char* msg, const unsigned long msg_len); // use the same 30K array

    int ret = 0;
    unsigned char public_key[32];
    unsigned char private_key[32] = "123456789ABC";
    unsigned char signature[64];
    unsigned char msg[64] = "abcdefghijklmnopqrstuvwxyz";
    sleep(20);
    #endif

    for (int i = 0; i < 1000000; i++)
    {
        #if 0 
        //compute public key
        ret = ed25519_getpub( public_key, private_key );
        if (0 != ret)
        {
            ret = 1;
        }

        printf("public_key = %s, ret = %d \r\n ", public_key, ret);

        ret = ed25519_sign( signature, private_key, msg, strlen(msg) );
        if (0 != ret)
        {
            ret = 2;
        }

        printf("signature = %s, ret = %d, \r\n", signature, ret);

        //verify sign
        ret = ed25519_verify( signature, public_key, msg, strlen(msg) );
        if (0 != ret)
        {
            ret = 3;
        }

        printf("ed25519_verify ret = %d, \r\n ", ret);
        #endif

        if (0 == (i % 5 ))
        {
            sleep(10);
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:-2)

代码量可归结为:(因为大部分代码通过''#if 0'...'#endif'序列消除了)

#include <unistd.h> // for the 'sleep()' function


int main( void )
{
    for (int i = 0; i < 1000000; i++)
    {
        if ( 0 == (i % 5 ) )
        {
            sleep(10);
        }
    }
}

其中:我正在ubuntu Linux 18.02上编译

这是我编译代码的方式:

gcc -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" 

这是我链接代码的方式:

gcc -ggdb -Wall -o "untitled2" "untitled2.c"

注意:-ggdb是这样,因此代码将包含gdb调试器的最大调试信息

编译/链接后,可执行文件的大小可以通过以下方式找到:

 ls -al untitled2.c

结果为:

 -rwxrwxrwx 1 richard richard 182 Mar  4 20:54 untitled2.c

182个字节看起来不像204k也不是40k

请发布您的编译器和操作系统,并编译+链接到dynamic(默认)可执行文件或static可执行文件