编程杂谈

字节顺序

  字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。

  基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。

  16位的转换函数:ntohs和htons
  ntohs(network to host short)是将网络字节顺序转换为主机字节顺序,返回值是一个16位的整数,即2个字节长度的整数short int,也可以写作uint16_t。
  htons(host to network short)是将主机字节顺序转换为网络字节顺序,返回值也是一个16位的整数short int。

  32位转换函数ntohl和htonl。
  ntohl(network to host long)是将网络字节顺序转换为主机字节顺序,返回值是一个16位的整数,即2个字节长度的整数long int,也可以写作uint32_t。
  htonl(host to network long)是将主机字节顺序转换为网络字节顺序,返回值也是一个16位的整数long int。

  inet_addr函数可以将一个点分十进制的IP地址转换成网络字节顺序的长整形十进制值。inet_ntoa函数将网络字节顺序的长整形十进制数值的IP地址转换成点分十进制。

堆(heap)栈(stack)

  在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

  栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

  堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

  堆(数据结构):列队优先,先进先出,堆可以被看成是一棵树,如:堆排序

  栈(数据结构):先进后出(First-In/Last-Out)

  一个由C/C++编译的程序占用的内存分为以下几个部分:

  1. 栈区 —— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等,速度较快,但程序员是无法控制的。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
  2. 堆区 —— 由程序员分配释放,一般速度比较慢,容易产生内存碎片,若程序员不释放,程序结束时可能由OS回收。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
  3. 全局区(静态区) —— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
  4. 文字常量区 —— 常量字符串就是放在这里的,程序结束后由系统释放 。
  5. 程序代码区 —— 存放函数体的二进制代码。
//main.cpp
int a = 0;//全局初始化区
char *p1;//全局未初始化区
main()
{
    int b;//栈
    chars[] = "abc";//栈
    char *p2;//栈
    char *p3 = "123456";//123456\0在常量区,p3在栈上。
    static int c = 0;//全局(静态)初始化区
    p1=(char*)malloc(10);
    p2=(char*)malloc(20);//分配得来的10和20字节的区域就在堆区。
}

函数调用约定

  函数调用约定,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值。

  几种类型:__stdcall,__cdecl,__fastcall,__thiscall,__nakedcall,__pascal

  Win32 API函数绝大部分都是采用__stdcall调用约定的。WINAPI其实也只是__stacall的一个别名而已(#define WINAPI  __stdcall)。在函数的面前用__stdcall作为修饰符。此时函数将会采用__stdcall调用约定,int __stdcall sumExample (int a, int b)。使用__stdcall调用约定生成的可执行文件要比__cdecl的要小,因为在每次的函数调用都要产生堆栈清理的代码,而栈的清理(堆栈平衡操作)是由被调用函数执行的。

  函数具有可变参数像我wsprintf这个函数,与前面的prinf一样,都必须使用__cdecl调用约定,因为只有调用者才知道参数的数量在每一次的函数调用,因此也只有调用者才能够执行堆栈清理操作。

时间: 2024-10-28 08:26:57

编程杂谈的相关文章

多核编程杂谈

多核计算杂谈--讨论在多核编程时.在CPU和内存层次上应该知道的一些东西. 尝试找到协调多核工作的本质上的问题. 这里讨论基本上參考x86体系,然后依据须要简化或改动. 先看看各个缓存: 为了解决訪问存储器和CPU操作之间的不平衡,使得存储器訪问不拖后退,利用局部性原理,将存储器分级,提升存储器读写性能的方案,称之为缓存.在这里的思考中.先把各个缓存去掉.于是面对的就是若干核.同一个存储器.这样看比較简单.所谓存储系统就变成黑盒,缓存通过自己的协议,保证不会读到脏数据,保证写的有效. (可是实际

Linux环境下网络编程杂谈<<转>>

今天我们说说“Pre-网络编程”.内容比较杂,但都是在做网络应用程序开发过程中经常要遇到的问题. 一.大端.小端和网络字节序 小端字节序:little-endian,将低字节存放在内存的起始地址: 大端字节序:big-endian,将高字节存放在内存的其实地址. 例如,数字index=0x11223344,在大小端字节序方式下其存储形式为: 上图一目了然的可以看出大小端字节序的区别. 还有另外一个概念就是网络字节序.网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型.操作

混合编程杂谈续——发布

上一篇简单的描述了一下混合编程中C++与python混合编程的操作,基本环节的搭建应该是没有什么问题了,这一篇说一下C++与python混合编程的发布问题,因为我们不能让客户和我们一样去了解程序的实现原理,他们要的只是一个结果,可以正常运行的程序,并不关心你的实现方式.因此我们要提供一个安装包,不依赖具体环境的可执行的程序. 在上一篇中我们实现了可以调用python脚本的环境,但是它的运行强烈的依赖环境,所以今天我们就要解决这个问题,将程序发布到其他别的机器上时不受限制. 今天在网上看了好多例子

混合编程杂谈

此文抛砖引玉,仅作记录,希望广大网友多多指正,谢谢! 最近接触了混编的项目,项目是02年开发的,当时使用的是VC6.0+TCL脚本,VC负责前台的界面显示,后台全部用TCL实现,由于公司规定不能截图出来,望大家海涵,大概描述一下工具的功能,主要用于检查某种负责通信的服务是否配置.运行等正常.大体功能如下:左边是局点的控制描述,主要记录有局点名称.局点IP.连接方式.用户名密码.是否使用内置FTP等信息,右边是每一个局点要执行的任务配置项,主要分为两个大项:健康检查和信息收集. 最近有一个新的需求

TCP网络编程杂谈

作为一名IT工程师,网络通信编程相信都会接触到,比如Web开发的HTTP库,Java中的Netty,或者C/C++中的Libevent,Libev等第三方通信库,甚至是直接使用Socket API,但是很多程序员都仅限于使用,对于使用的方式是否合理并没有特别深的理解,比如有一股脑的使用线程池解决问题的(虽然大部分情况采用多线程方案不会有什么问题,但是编程复杂度比起单线程提升了很多,线程开的太多也会导致切换过于频繁,性能未必有太大提升),也有始终用一条线程处理所有业务的,然后上线之后经常出现各种服

ime编程杂谈

很早之前,就想用vc+开发一款输入法.但我必须熟悉自然输入法原理. 自然语言处理的输入法作业成品没有做出来,但不想再在蛋疼的Win32上面耗费时间了,整理文档,记录一下心得,新手再来研究也不会迷路太远. 1. IME简介 2. IME结构 3. IME调试环境配置及安装 3.1. 配置步骤 3.2. 配置说明及注意事项 3.3. IME安装及卸载 4. IME编程心得 4.1. 准备工作 4.2. IME数据结构介绍 4.3. IME接口调用顺序 4.4. 感想 1       IME简介 什么

编程杂谈-好的程序员Vs.差的程序员

相关研究表明,最好程序员的生产力最高可比最差程序员的高 28 倍.但是用在这些最好程序员身上的成本肯定不会有这么多,所以他们是软件领域中最划算的“特价商品”. ROBERT GLASS,<FACTS AND FALLACIES OF SOFTWARE ENGINEERING> 如果你一定要比较的话,那么其实程序员更像是作家. 有些作家写出的东西能数以百万计地卖出去,而有些作家写出来的东西无聊至极最后只能用来烧火用! 但是,他们都生产出了一本书,因此,他们都是作家.可是除非你去阅读他们的书,否则

网络编程杂谈

1. 弱端系统与强端系统 假定你有两台计算机: A: eth0: 192.168.0.1 B: eth0: 192.168.0.2;  eth1: 10.0.0.2 A的eth0连接到B的eth1. 你从A发一个目的IP为192.168.0.2的报文,若B接受,则是弱端系统:若B不接受,则为强端系统. 2. connect错误后必须重新调用socket.

编程杂谈—— 浮点数

参考链接:mysql float精度与范围总结 1.单精度浮点数用4字节(32bit)表示浮点数,采用IEEE754标准的计算机浮点数,在内部是用二进制表示的 如:7.22用32位二进制是表示不下的. 所以就不精确了. 2.MySQL 中为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数. 3.DECIMAL和NUMERIC类型在MySQL中视为相同的类型.它们用于保存必须为确切精度的值,例如货币数据. 当声明该类型的