Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does C++ linking use virtually no CPU?

On a native C++ project, linking right now can take a minute or two. Yet, during this time CPU drops from 100% during compilation to virtually zero. Does this mean linking is primarily a disk activity?

If so, is this the main area an SSD would make big changes? But, why aren't all my OBJ files (or as many as possible) kept in RAM after compilation to avoid this? With 4 GB of RAM I should be able to save a lot of disk access and make it CPU-bound again, no?

Update: so the obvious follow-up is, can the VC++ compiler and linker talk together better to streamline things and keep OBJ files in memory, similar to how Delphi does it?

like image 652
Mr. Boy Avatar asked Apr 29 '10 21:04

Mr. Boy


People also ask

Why is the linking step necessary in C?

The linking step is necessary to resolve all the references to external functions and to include the machine code for those functions in the final executable. Why is "linking" a "separate step"? You need at least two "separate steps" to get the assembler output, and two separate steps after that to get an executable.

What is linker in embedded system?

Linker is a program in a system which helps to link object modules of a program into a single object file. It performs the process of linking. Linkers are also called as link editors. Linking is a process of collecting and maintaining piece of code and data into a single file.

Which step does the linker perform after it successfully assigns a reference to each symbol in the code?

Symbol resolution ↑top The linker resolves symbol references by associating each ref with exactly one symbol definition from the symbol tables of its input relocatable obj files. Symbol resolution is easy for references to local variables that are defined in the same module as the ref.


1 Answers

Linking is indeed primarily a disk-based activity. Borland Pascal (back in the day) would keep the entire program in memory, which is why it would link so fast.

Your OBJ files aren't kept in RAM because the compiler and linker are separate programs. If your development environment had an integrated compiler and linker (instead of running them as a separate processes), it could indeed keep everything in RAM.

But you would lose the ability to separate the development environment from the compilers and/or linkers - you would have to use the same compiler/linker, and you wouldn't be able to run the compiler outside the environment.

like image 101
Eric Brown Avatar answered Sep 19 '22 20:09

Eric Brown