【发布时间】:2018-07-01 17:06:16
【问题描述】:
基于this C tutorial page 中的 cmets,我在一段时间未使用 C 后使用它来审查 C,我希望使用共享版本库编译的简单程序似乎比 C 版本使用更少的内存该程序使用库的静态版本。
这是一个简单的示例程序,它请求用户输入,这样程序在我去使用top 和ps 进行检查时将处于空闲状态。目标是只用-lm(链接libmath)编译程序,然后用-lm --static 编译它。当我运行每个程序时,我应该看到静态选项占用与其运行进程相关的更少内存。
/* lib_a_vs_so.c */
#include <math.h>
#include <stdio.h>
void main()
{
double x = sin(3.14);
int user_input;
printf("Enter a number: ");
scanf("%d", &user_input);
printf("You entered %d and sin(3.14) is %.2f\n", user_input, x);
}
编译两个不同版本的步骤:
c99 -o so_version lib_a_vs_so.c -lm
c99 -o a_version lib_a_vs_so.c -lm --static
当我运行这两个程序时,我的系统上top 的输出(gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1))。
top - 19:06:51 up 10:20, 5 users, load average: 0.06, 0.24, 0.25
Tasks: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.4 us, 0.8 sy, 0.0 ni, 96.4 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 16327932 total, 7522656 used, 8805276 free, 435692 buffers
KiB Swap: 0 total, 0 used, 0 free. 2836848 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7010 ely 20 0 4192 356 276 S 0.0 0.0 0:00.00 so_version
7025 ely 20 0 1080 264 212 S 0.0 0.0 0:00.00 a_version
为什么so_version 似乎使用更多内存?
【问题讨论】:
-
很简单地说,如果你使用静态库,你只能从中得到你需要的东西。如果您使用共享库,您将获得全部内容,但您通常会与系统上碰巧使用同一库的任何其他进程共享它。这看起来是更多还是更少的内存在某种程度上取决于有多少其他进程正在使用它,以及共享内存的计算方式。
-
啊,有道理。我现在还看到,这两个可执行文件的磁盘占用空间确实与直觉相符。
a_version为 868k,但so_version仅为 20k。这个磁盘大小是否反映了整个 libmath.a,或者只是与sin以及宏/其他相关的一部分? -
你的程序不仅使用了libm,还使用了libc。
-
@Deduplicator 这让我更加困惑。当我尝试使用
c99 -o a_version lib_a_vs_so.c /usr/lib/x86_64-linux-gnu/libm.a时,现在两个可执行文件在磁盘上的大小相同,均为 20K(.so 版本的原始大小)。为什么将动态 libc 与静态 libm.a 结合使用会导致与两个库都是动态的大小相同? -
好吧,你的编译器知道
sin(),所以它可以在编译时执行它,或者内联它,或者其他什么。这意味着实际上没有使用来自 libm 的符号,因此对它的所有引用都被丢弃...
标签: c gcc memory shared-libraries static-libraries