内存浪费?如果main()应该只返回0或1,为什么main是用int而不是short int甚至char声明的?

Rob*_*rtS 6 c c++ memory types allocation

例如:

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

为什么main()通常用inttype 定义类型,如果通常只返回0或1,则在32位内存上分配4个字节,而其他类型(例如short int(2个字节,32位)甚至char(1个字节,32位)会节省更多的内存吗?

它浪费了内存空间。

注意:问题不是给定线程的重复;它的答案仅对应于返回值本身,而与明确关注的数据类型不对应。

问题是针对C和C ++的。如果这些答案之间的答案有所变化,请在提到特定语言的上下文时分享您的智慧。

Vla*_*cow 9

通常,汇编器使用其寄存器返回值(例如AXIntel处理器中的寄存器)。类型int对应于机器字,即,不需要将例如与类型char相对应的字节转换为机器字。

实际上,main可以返回任何整数值。

  • @DavidRanieri这是一个错误的解释。简单地,标准引入了两个宏来简化代码编写。这并不意味着这些值是标准值,而其他值则不是。实际上,所有值都是实现定义的。 (3认同)

mol*_*ilo 6

这是因为一台机器已有半个世纪的历史了。

早在创建C的那一天,an int是PDP-11上的一个机器字-16位-并且将其main返回自然而有效。

Ritchie和Thompson较早开发了B语言,而C则从B语言中脱颖而出。
当C添加类型时,未指定类型会给您一个机器字-an int
(当时节省空间非常重要,因此不需要拼出最常见的类型就是一件很好的事情。)

因此,由于B程序开始于

main()
Run Code Online (Sandbox Code Playgroud)

并且程序员通常是语言保守的,C做了同样的事情并返回了int


chu*_*ill 5

我不认为这是浪费有两个原因:

1个实际使用的4字节退出代码

如果要返回准确描述错误的退出代码,则需要8位以上的位。

例如,您可能希望对错误进行分组:第一个字节可以描述错误的模糊类型,第二个字节可以描述导致错误的函数,第三个字节可以提供有关错误原因的信息,第四个字节可以描述错误的原因其他调试信息。

2填充

如果传递单个 short或char,它们仍将对齐以适合一个机器字,这通常为4 Byte / 32位,具体取决于体系结构。这称为填充,意味着您很可能仍需要32位内存才能返回单个 short或char。


vla*_*sch 2

第一:您的假设/陈述本身if it usually returns only 0 or 1就是错误的。

通常,如果没有发生错误,则返回代码0,但否则它可以返回任何数字来表示不同的错误。大多数(至少是命令行程序)都是这样做的。许多程序也输出负数。

然而,这里还有一些常用的代码,https://www.tldp.org/LDP/abs/html/exitcodes.html另一个SO成员指向包含一些代码的unix标头/sf/answers/1688492571/

因此,毕竟它不仅仅是一个CC++类型的东西,而且还有大多数操作系统如何工作并期望程序表现的历史原因,并且因为语言必须支持这一点,所以至少C像语言通过使用int main(...).

第二:你的结论It is wasting memory space是错误的。

  1. 与较短的类型相比,使用int不会造成任何浪费。无论如何,内存通常以字大小处理(这意味着可能取决于您的架构)
  2. 使用子字类型涉及某些架构上的计算开销(读取:加载,字,屏蔽掉不相关的位;存储:加载内存,屏蔽掉变量位,或者使用新值,将字写回)
  3. 除非你使用它,否则内存不会被浪费。如果你写的话,return 0;此时就不会使用任何内存。如果你return myMemorySaving8bitVar;只使用了 1 个字节(最有可能在堆栈上(如果根本没有优化的话))