Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Memory waste? If main() should only return 0 or 1, why is main declared with int and not short int or even char?

For example:

#include <stdio.h> 
int main (void)                         /* Why int and not short int? - Waste of Memory */ 
{
     printf("Hello World!");
     return 0; 
}

Why main() is conventional defined with int type, which allocates 4 bytes in memory on 32-bit, if it usually returns only 0 or 1, while other types such as short int (2 bytes,32-bit) or even char (1 byte,32-bit) would be more memory saving?

It is wasting memory space.

NOTE: The question is not a duplicate of the thread given; its answers only correspond to the return value itself but not its datatype at explicit focus.

The Question is for C and C++. If the answers between those alter, share your wisdom with the mention of the context of which language in particular is focused.

like image 637
RobertS supports Monica Cellio Avatar asked Oct 11 '19 08:10

RobertS supports Monica Cellio


3 Answers

Usually assemblers use their registers to return a value (for example the register AX in Intel processors). The type int corresponds to the machine word That is, it is not required to convert, for example, a byte that corresponds to the type char to the machine word.

And in fact, main can return any integer value.

like image 157
Vlad from Moscow Avatar answered Nov 15 '22 06:11

Vlad from Moscow


It's because of a machine that's half a century old.

Back in the day when C was created, an int was a machine word on the PDP-11 - sixteen bits - and it was natural and efficient to have main return that.

The "machine word" was the only type in the B language, which Ritchie and Thompson had developed earlier, and which C grew out of.
When C added types, not specifying one gave you a machine word - an int.
(It was very important at the time to save space, so not requiring the most common type to be spelled out was a Very Good Thing.)

So, since a B program started with

main()

and programmers are generally language-conservative, C did the same and returned an int.

like image 24
molbdnilo Avatar answered Nov 15 '22 05:11

molbdnilo


There are two reasons I would not consider this a waste:

1 practical use of 4 byte exit code

If you want to return an exit code that exactly describes an error you want more than 8 bit.

As an example you may want to group errors: the first byte could describe the vague type of error, the second byte could describe the function that caused the error, the third byte could give information about the cause of the error and the fourth byte describes additional debug information.

2 Padding

If you pass a single short or char they will still be aligned to fit into a machine word, which is often 4 Byte/32 bit depending on architecture. This is called padding and means, that you will most likely still need 32 bit of memory to return a single short or char.

like image 27
churill Avatar answered Nov 15 '22 05:11

churill