gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:43:16 24 4
gpt4 key购买 nike

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

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

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;
}

最佳答案

大量代码归结为:(因为大部分代码都是通过“#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

请发布您的编译器、操作系统,以及您是否编译+链接到动态(默认)可执行文件或静态可执行文件

关于c - 为什么 Linux VmSize VmData 比代码估计的要大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54957193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com