linux GCC 64位编程技巧

linux 安装 gcc 64位 依赖包 最近安装整理的gcc依赖包 适用redhat 5 x64 centos系统 立即下载
    linux GCC 64位编程技巧

64位系统的优势?

既然要采用64位系统,首先要知道64位系统的优势所在。对于技术人员来说,完全没有必要去看那些厂家拿出的厚厚的说明书、或者某个研究机构抛出的一堆的数字,64位系统的优势总结起来很简单:内存大、速度快!

内存大

与32位系统相比,64位系统的地址空间大大增大,达到了18PB,18PB究竟是多大呢?说出来有点吓人:4G内存的40亿倍!这么大的空间,不要说内存了,就是整个磁盘的数据都放进去也是没有任何问题的。

需要注意的是:已有的32位系统由于采用了物理地址扩展技术(PAE,http://en.wikipedia.org/wiki/Physical_Address_Extension ),使得操作系统可用物理内存能够超过4G,但对于单个程序来说,能够使用的内存(即地址空间)还是只有4G,这个是无法突破的。

速度快

你可能很容易就推断如下结论:64位系统速度应该比32位快,而且应该是快两倍!

但实际情况可能让你有点吃惊:64位和速度没有绝对的比例关系,甚至可能速度更低。

64位架构处理器就本身而言,不会在速度上两倍于32位的同等处理器。为什么呢?简单来说:所谓的64位,只是和内存地址空间有关,和CPU速度没有一点关系,更不是64/32=2倍的关系。

另外,如果程序不需要对大量的数据进行处理,64位反而可能变慢,因为64位的地址是8位,32位的地址是4位,如果处理器的缓存是一样大小,那么很明显64位处理器能够缓存的东西是32位的一半,这反而降低了缓存命中率,因此影响了性能。

既然这样,那我们为什么还要说64位会更快呢?

我们知道,决定性能的不单是CPU,还有内存、磁盘、网络等一大堆东东,而64位机器在性能上改善最大的就是内存容量大大增加,从4G扩展到18PB,这就意味着内存中可以放很多数据,避免频繁的磁盘读写IO,从而大大提高性能;同时也意味着同一时间可以处理更多的数据,这也能够大大提高性能,尤其是多核多CPU并行处理的时候。

CPU本身结构的变化也会带来性能上的提升,这个提升主要体现在处理超过32位的整形数据上。对于32位系统,为了处理超过32位的整形数字,需要4次额外的寄存器操作;而64位系统,不需要这4次额外的寄存器操作。

某些CPU可能会为64位运算提供一些特定的特性,这也会带来一些特定处理上的性能提升,不过这种提升和具体的CPU相关,不是通用的特性。相关信息可以参考:更快、更强 64位编程的三十二条军规。

什么情况下一定要使用64位?

64位虽好,但并不是放之四海皆准,毕竟从已有的32位升级到64位是要银子的,如果你写个“Hello, world!”也一定要求放到64位系统上来提高性能,那完全是浪费!

如下情况是必须用到64位系统的情况:

1.      程序(不是整个系统)需要超过4G的内存地址空间;

2.      使用libkvm库,或者/dev/mem,/dev/kmem的文件;

3.      使用/proc调试64位进程;

4.      使用只有64位版本的库;

5.      需要64位寄存器来更高效的进行64位运算,例如处理long long类型数据;

6.      使用超过2G的文件;

32位和64位开发环境差别?

如果你是使用Java/Python等跨平台的语言进行开发,那么恭喜你,所谓的64位和32位对你来说没有差别,因为底层的虚拟机已经屏蔽掉了这种差异,在语言的层面是不需要理解这种差异的(这也是跨平台的一个原因吧)。

但如果你是用C/C++,那就有点郁闷了:C/C++是和系统强相关的,你在32位机器上写的代码,拿到64位机器上运行,可能出现你意料之外的结果,甚至可能崩溃,而且你还很难定位!

问题虽然很严重,而原因很简单:32位系统使用的数据模型是ILP32,而64位系统使用的数据模型是LP64或者LLP64.

ILP32:指的是int, long, pointer长度是32位,取首字母合起来就是ILP32(下面的简写都是这样的),windows和Unix类32位系统都是这种模型;

LP64:指的是long, pointer是64位,这个是Unix类64位系统采用的数据模型;

LLP64:指的是long long, pointer是64位,而long还是32位,这是Windows的64位系统采用的模型;

除了这个最主要的区别外,另外一个区别就是有的库可能只有64位版本,但不会只有32位版本,因为64位是支持所有32位的库的。

Linux GCC 64位编程技巧

1 长整形数据

既然64位和32位开发环境主要的差别是数据模型的不同,那么最简单的一个方法就是尽力避开这种差异:咱们不用long类型了,管你32位还是64位,惹不起还躲不起么?

如果一定要用长整形,也还是不要用long,直接用__int64_t,如果你觉得写起来麻烦,那就自己定义为LLONG:typedef  __int64_t LLONG即可

2 指针数据

long类型可以不用,但指针没有办法不用,那就只能勇敢的面对了:)

1.指针打印:在使用printf的时候,指针打印控制符是%p,不要用%d或者%i.

2.指针转换:将指针转换为整形数据的时候,使用intptr_t,不要使用int。

如果用C++的stream流,则不存在这些问题,直接输出即可。

3 使用sizeof来确定长度

不管任何时候,都使用sizeof来确定变量或者类型的长度。

例如:对于结构来说,64位系统默认对齐的长度是8字节,而32位默认是4字节,因此在使用结构长度的时候,不能将长度写死,而要使用sizeof计算。

4 注意常量类型陷阱

当你写下long  j = 1 << 32;的时候,你是否以为系统会将1识别为long类型,然后给j赋值为2的32次方?

然而系统却在这里设下了一个陷阱:如果你不指定常量类型的话,常量默认就是int类型的!

因此不管你是32位还是64位,j的值都是0。

要想避开这个陷阱,就要指定常量的类型(常量也是有类型的),因此要写成:long j = 1L << 32;

常见常量类型:l/L,ll/LL,ul/UL,ull/ULL

5 注意sign extension陷阱

当负整数转换为更长类型的无符号整数时,首先是转换为目标类型对应的有符号类型,然后再转换为无符号类型。

例如:

int i = -1;

unsigned long j = i;

则-1首先转换为signed long型,再转换为unsigned long型.

在这个转换过程中,有一个小小的陷阱:当从短的数据类型转到长的数据类型的时候,为了保证负数的有效性,会在多于的比特位填充1(因为负数的二进制码是补码,只有补1才能保证负数的符号和取值都不会变).

例如:

int i = 0x80000000; //对应十进制的有符号数-2147483648或者无符号数2147483648

unsigned long j = i;

你可能以为j会直接等于0x0000000080000000,但事实上j会等于0xffffffff800000000;

6 size_t,pid_t等***_t类型

C/C++的库为了支持跨32位和64位,很多函数返回值都是***_t,例如sizeof操作,这种***_t实际上就是随32位或64位而变化的整形数。

1.      如果要使用返回值为***_t的函数,则变量也直接声明为***_t;

2.      如果要打印***_t的变量,gcc可以使用%Zu, %Zd;或者直接将变量转换为更长类型的数据后再打印,例如long或者long long,使用%lu, %llu, %ld, %lld控制符进行控制。

7 如果你不清楚长度,那么就转换为一个最长的数据

如果有的类型,如果你根本不知道它到底有多长,或者到底是什么类型,那么最简单的方式就是将其转换为一个最长的数据:整形当然是long long了,如果你连是否有符号都不知道,那就转换为double吧。

8 打开所有编译开关,关注警告

无论在32位还是64位系统下编译,-Wall选项都打开,虽然这不能保证100%能够发现所有问题,哪怕只能解决一个,也能够帮助你大大减少自己定位问题的时间。

参考资料

64位编程军规:

http://www.vipcn.com/chengxukaifa/shujujiegou/gengkuaigengqiang-64weibianchengdesanshiertiaojungui.html

sign extension:

http://en.wikipedia.org/wiki/Sign_extension

海康VisionMaster与西门子PLC1200进行S7通信 通信是连通算法平台和外部设备的重要渠道,在海康VisionMaster算法平台中既支持外部数据的读入也支持数据的写出,当通信构建起来以后既可以把软件处理结果发送给外界,又可以通过外界发送字符来触发相机拍照或者软件运行。 本文以西门子PLC1200作为外部设备为例,讲解海康VisionMaster与西门子PLC1200进行S7通信。...... 阅读详情

相关推荐

HFSS之天线设计实例

目录 矩形微带天线 微带天线尺寸计算 微带线的3个关键指标如以下 HFSS设计流程 新建工程并设置求解类型 天线建模 添加求解设置和扫频设置 天线建模步骤 谐振点查看 优化设计 查看天线分析结果 3D增益 Smith圆图 S参数 驻波比 ​ 平面增益 方向性系数\增益\轴比 矩形微带天线 微带天线的概念首先是由Deschamps于1953年提出来的,经过20年左右的发展,Munson和Howell于20世纪70年代初期制造出来了实际的微带天线 一个简单的...

ASH_GUARDIAN的博客 1万+

GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)...

作者:zyl910   为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且不仅兼容Linux下的GCC,还支持MinGW、TDM-GCC等Windows下的GCC编译器。 一、C程序代码   为了测试条件编译的效果,以下...

weixin_34122604的博客 1014

小红书高时效推荐系统背后的技术升级

在小红书 APP 中,推荐系统的实效性对推荐效果有着特别重要的影响,特别是作为 UGC 平台,小红书的推荐系统如果能更快地捕捉用户与笔记之间的变化和联系,就能够给推荐带来更好的效果。在2021年上半年,首页推荐的召回、粗排、精排的主要模块都保持在天级更新的状态,我们通过持续迭代,将召回 CF 渠道、召回索引更新、召回模型/粗精排模型的训练都做到了分钟级更新,为首页推荐的分发效率带来飞跃式提升,并给业务侧带来非常显著的收益。 小红书站内“最近一天内发布的新笔记”在首页的曝光占比一直很高,这段时间更是快速

REDtech_1024的博客 3521

Linux GCC 64位编程技巧

Linux GCC 64位编程技巧,项目要用到,上网查了一下,资料虽多,但零零散散,干脆自己整理一份,共享给大家。 Windows和Linux类似,但有的细节还需要大家自己查了。

华仔-技术博客 1万+

用PyCharm+Scrapy打造你的第一个爬虫:从安装到实战(附完整代码)

本文详细介绍了如何使用PyCharm和Scrapy框架从零开始构建高效网络爬虫。通过环境配置、项目创建、核心爬虫逻辑编写到数据处理与存储的完整流程,帮助Python开发者快速掌握爬虫开发技巧,并附有实战代码示例。特别适合想要学习Scrapy框架和提升爬虫技能的开发者。

weixin_29038345的博客 868

使用AutoDL云服务器训练YOLO计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

AutoDL AI算力云是一个提供人工智能算力服务的云平台。丰富的GPU资源:提供多种GPU型号,包括NVIDIA的A100A800L40V100RTX 4090RTX 3090等,能满足我们在不同场景下的需求,无论是进行大规模的AI训练还是复杂的科学计算等任务,都可以找到合适的GPU资源。灵活的付费方式:支持按量付费包日包周包月等多种付费模式。对于短期的实验或不确定时长的项目,可以选择按量付费;如果有长期稳定的算力需求,预付费或包周包月则可能更划算,可以根据自己的需求和预算进行选择。集成主流框架:集成了。

Limiiiing的博客 957

win10安装gcc 64位

win10安装gcc 64位,指导教程

lucyLee的博客 2万+

Qt —— 在Win11下“Qt for Android“开发环境,通过USB在真机(华为Meta60 PRO)上调试运行,并打包APK并在真实手机运行

Qt —— 在Win11下“Qt for Android“开发环境,打包APK并在真实手机运行

311

linux下gcc编译时默认是32位还是64位,怎么指定为32or64?

这时我发现,在win32和win64平台下,long都是4字节的,我记得有些情况下long是8字节,所以我就继续进行验证,我在电脑上装上了xshell,登上了服务器,试图在linux平台下找到这种情况。然后再vim编辑器下写了同样的代码,准备使用gcc进行编译时想到:linux下怎么指定32or64位平台下编译代码?因为需要配置一些东西,这篇文章中都有提到,感兴趣的话可以点进去看一下这篇文章。然后找到了long打印为8字节的情况。

qq_63179783的博客 1801

Win11此电脑怎么放在桌面上?Win11此电脑如何显示在电脑桌面上?

相信用习惯Win10的用户都喜欢电脑电脑桌面上的此电脑,但是很多用户更新完Win11正式版以后,发现桌面只有回收站和Microsoft Edge图标,没有此电脑。那么,Win11此电脑要如何显示呢?下面小编为大家简单介绍一下操作方法!5、桌面图标设置窗口,点击勾选计算机,然后点击确定,桌面就可以显示此电脑图标了。1、桌面空白处,点击右键,在打开的菜单项中,选择显示设置;4、个性化 - 主题,相关设置下,点击桌面图标设置;3、右侧点击主题(安装、创建、管理);2、设置窗口,左侧点击个性化;

shengyin714959的博客 13万+

【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题

【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题

WW、forever的博客 710

矿业振动电机选型维护全攻略:从激振力计算到故障排查实战

异步电动机作为工业驱动核心,通过偏心块旋转将电能转化为激振力,实现物料的高效处理。其技术价值在于结构紧凑、维护门槛低,且激振力可无级调节,特别适应矿山粉尘大、湿度高、连续运转的恶劣工况。在振动给料、筛分、输送、脱水等场景中,合理选型与正确安装直接决定设备寿命。本文聚焦矿业振动电机,系统讲解激振力计算、偏心块调节、安装规范及常见故障排查,帮助运维人员提升现场实操能力。

weixin_34343000的博客 328

【OpenClaw从入门到精通】第45篇:Skill供应链安全——如何识别并避开恶意技能插件?(2026实测版)

随着OpenClaw生态爆发式增长,全球Skills总量近75万个,日均新增2.1万个,但恶意/问题插件已超600个,数十万用户受影响。本文基于奇安信威胁报告及360安全实践,拆解恶意技能的五大核心特征,提出"安装前三步法"安全审查流程,详解安全技能来源白名单与定期审计方案,并深度解析360龙虾Skill安全超市的分级认证机制。读者可掌握从技能筛选、安装审查到术后审计的全流程安全防护手段,通过实操命令与案例演示,零成本构建Skill供应链安全防线,避免遭遇私钥窃取、资产损失等安全事件。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 561

64位Ubuntu上编译32位程序操作步骤

64位Ubuntu上编译32位程序操作步骤

网络资源是无限的 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

int64位整数

在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf("%lld",a),printf("%I64d",a),和cout 本文讨论的是五种常用的C/C++编译器对64位整型的支持,这五种编译

I am a coder 5146

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

__int64 与long long 的区别

//为了和DSP兼容,TSint64和TUint64设置成TSint40和TUint40一样的数   //结果VC中还是认为是32位的,显然不合适   //typedef signed long int     TSint64;   //typedef unsigned long int   TUint64;      //ANSI C中规定long long才能表示64位   //参

黄俊东的专栏 2210

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Cocos2d-x V2.x版本对64bit的支持

原文链接:http://www.cnblogs.com/meteoric_cry/p/4171535.html 2015年2月1日后新提交的应用必须要支持64位架构。 我所使用的是cocos2d-x V2.0版本,而且源码有部分代码是修改过的。好在cocos2d-x官方已经放出了一个支持64位的2.2.6版本,可以做为参考。 iOS 64-bit support fo

客亦知夫水与月乎? 977

linux下出现architecture of input file `*.o' is incompatible with i386:x86-64 output的解决方法

architecture of input file `*.o' is incompatible with i386:x86-64 output ld returned 1 exit status

豌豆先生 1万+

linux 编译32位qt,64 位Ubuntu下用32 位的Qt GCC 编译程序

一、多架构支持1.确认64位架构的内核输入dpkg --print-architecture显示 amd64 确认为64位架构内核2.确认打开多架构支持功能(出现32位依赖问题时,安装32位的包)输入dpkg --print-foreign-architectures显示 i386确认多架构如果没有多架构:输入sudo dpkg --add-architecture i386添加32构架sudo ...

weixin_29570673的博客 2694
上一篇: 设置linux时间
下一篇: 内核中的多播
linuxliu
博客等级 码龄17年 23粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值