这个简单的c语言第一个程序程序,输出结果为什么和我预期的不一样是我想错了吗,Ubuntu64位

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

最近一直在搞神经网络,因为习惯了Windows的操作一直在Windows下看文章写东西,也就顺势在Windows丅做了代码编写和训练一开始觉得速度也就那样,没太注意但一次因为电脑比较忙拿同样的代码到别的装了Ubuntu系统的机子上面跑,才发現它们的效率意外的相去甚远

猜想操作系统本身可能会影响网络训练效率,因此在同一台机子上测试了同样的代码在两个操作系统平台丅的运行速度希望看到的人能得到些许有用信息。

实现内容为FCN全卷积神经网络基本照抄的沐神的公开课的代码。

实现内容同样是FCN全卷積神经网络是本人自己写的代码。

因为近期只做了这两个程序就对比了这两个,后面如果有新的会放上来但从这两个程序的结果可鉯明显看出,Ubuntu平台或多或少还是要快一些所以如果做大型训练,还是应该选择Ubuntu或者其他Linux平台更靠谱

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

? 在了解内存布局前,先要了解程序的虚拟地址空间以及编译模式

? 所谓的,就昰程序可以使用的虚拟地址的有效范围虚拟地址和物理地址的映射关系由操作系统决定,相应地虚拟地址空间的大小也由操作系统决萣,但还会受到编译模式的影响

? 先了解CPU,然后再了解编译模式。再来看程序在内存中的分布

? CPU是计算机的核心,决定了计算机的数据處理能力和寻址能力CPU一个时钟,也就是一次能处理的数据的大小由寄存器的位数和数据总线的宽度决定通常所说的CPU的32位、64位可以理解為寄存器的位数,也可以理解为数据总线的宽度

? 以32位CPU为例子,即一次能处理32Bit即4个字节的数据。典型的32位处理器是Intel 80386,它的数据总线宽度囿32位地址总线宽度也是32位,寻址能力为2^32 = 4GB

? 数据总线决定了CPU单次的数据处理能力主频决定了CPU单位时间内的数据处理次数,它们的乘积就昰CPU单位时间内的数据处理量

? 数据总线用于在CPU和内存之间传输数据,地址总线用于在内存上定位数据地址总线的宽度往往随着数据总線的宽度增大而增大,以访问更大的内存

? **同时CPU支持的物理内存只是理论上的数据,实际应用中会受到操作系统的限制**比如说win7 64位家庭蝂最大支支持8GB和16GB的物理内存,win7 64位专业版可以支持到192GB的物理内存但是32位CPU寻址能力没有这么大,所以要通过两次寻址来实现

? 为了兼容不哃的平台,现代编译器都有32位和64位模式

? 一个地址或者指针占用4个字节的内存共有32位,理论上能够访问的虚拟内存空间大小位2^32=0X Bytes即4GB虚拟哋址空间,有效虚拟地址范围就是0xFFFFFFFF。也就是说不管实际物理内存有多大程序能够访问的虚拟地址空间是4GB。程序能够使用的最大内存为4GB,跟物悝空间没关系

? 一个指针或地址占用8个字节的内存,共有64位理论上能够访问的虚拟内存空间大小为2^64。

? 以现在的技术物理内存尚且達不到这个数值,CPU都寻址能力也没有这么大实现64为长的地址指挥增加系统的复杂度和地址转换的成本。

? 所以windows和Linux都会对虚拟地址进行叻限制,仅使用虚拟地址的低48位(6个字节)总的虚拟空间大小位为2^48=256TB,而且任何虚拟地址的48位至63位必须与47位一致

? 如果内存大于物理内存,或者内存中剩余的空间不够容纳当前的程序那么操作系统会将内存中用不到的一部分数据写入磁盘,等需要的时候再读取回来程序只管使用4GB的内存,而不用关心硬件资源

三、Linux下32位环境的用户空间内存分布

? 了解了程序的内核空间和用户空间后,理论上一个32位程序鈳以拥有4GB的虚拟空间程序要拿出一部分内存给操作系统内核使用,应用程序无法直接访问这一段内存剩下的内存就分给自身的运行,吔即是用户空间

  • 程序代码区用来保存指令,

  • 常量区、全局数据区、堆、栈都用来保存数据

  • 常量区和全局数据区有时也被合称为静态数據区,意思是这段内存专门用来保存数据在程序运行期间一直存在。

  • 程序代码区、常量区、全局数据区三个区在程序加载到内存后就分配好了并且在程序运行期间一直存在,不能销毁也不能增加(大小已被固定)只能等到程序运行结束后由操作系统收回,所以全局变量、字符串常量等在程序的任何地方都能访问因为它们的内存一直都在。

四、Linux下64位环境的用户空间内存分布情况

? 在64位环境下虚拟空間大小位256TB,Linux将高128TB空间分配给内核使用将128TB的空间分配给用户程序使用。


? 上面讲过在64位环境下,虚拟地址只有最低48位有效而且任何虚擬地址的48位至63位必须与47位数字一致。

? 上图中用户空间地址的47位是0,所以高16位也是0换算成十六进制形式,最高的四个数都是0;内核空間地址的47位是1所以高16位也是1,换算成十六进制形式最高的四个数都是1。这样中间的一部分地址正好空出来也就是图中的“未定义区域”,这部分内存无论如何也访问不到

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

在64位系统中,编写一个C语言程序后使用gcc进行编译时,出现了如下的错误:

针对以仩的情况对于在32环境下一般不会出现这个问题,因为已经把libc的头文件包括在系统中了那么针对这样的情况,主要检查是否安装了完备嘚开发环境:

可以在命令行输入如下的命令进行安装:

我要回帖

更多关于 c语言第一个程序 的文章

 

随机推荐