zoukankan      html  css  js  c++  java
  • C++ sizeof 64位和32位下的对比

    C++中sizeof的作用是求字节数。32bit编译环境下,C++的一个指针(地址)为4个字节,64bit下一个指针占8个字节。

    常用数据类型对应字节数
      可用如sizeof(char),sizeof(char*)等得出

     32位编译器:

          char :1个字节
          char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
          short int : 2个字节
          int:  4个字节
          unsigned int : 4个字节
          float:  4个字节
          double:   8个字节
          long:   4个字节
          long long:  8个字节
          unsigned long:  4个字节

      64位编译器:

          char :1个字节
          char*(即指针变量): 8个字节
          short int : 2个字节
          int:  4个字节
          unsigned int : 4个字节
          float:  4个字节
          double:   8个字节
          long:   8个字节
          long long:  8个字节
          unsigned long:  8个字节


    可以看到,很多常用的基本类型包括int、char、short、double等,在32bit和64bit中所占的字节数并没有变化。64位相对于32位的提升,一个要素是在于地址的变化,32bit的机器中地址是用32个比特存的,所以机器最多只能有2^32 = 4G的内存,而64位机器最大可支持2^64(多大自己算一下,好像是17179869184G)的内存;同时64位CPU每个流水线周期可提取64bit数据,而32位的每次最多能读32bit数据,自然数据读取速度快多了。


    示例代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void function(int array[])
    {
    	/*作为函数参数传递进来之后,
    	数组名会自动退化为指针,
    	所以sizeof(数组名)实际是求一个指针的字节数 */ 
    	cout<<"function: "<<sizeof(array)<<endl;	
    }
    
    int main()
    {
    	int array[] = {1, 2, 3};
    	int *pionter = new int[12];
    	
    	//计算的是整个数组的字节数 
    	cout<<"sizeof(array): "<<sizeof(array)<<endl;
    	
    	//可以用sizeof了解自己编译器分配给基本类型的字节大小 
    	cout<<"sizeof(int): "<<sizeof(int)<<endl;
    	cout<<"sizeof(int&): "<<sizeof(int&)<<endl;
    	cout<<"sizeof(short): "<<sizeof(short)<<endl;
    	cout<<"sizeof(short&): "<<sizeof(short&)<<endl;
    	cout<<"sizeof(short*): "<<sizeof(short*)<<endl;
    	cout<<"sizeof(char): "<<sizeof(char)<<endl;
    	cout<<"sizeof(double): "<<sizeof(double)<<endl;
    	cout<<"sizeof(float): "<<sizeof(float)<<endl;
    	cout<<"sizeof(long): "<<sizeof(long)<<endl;
    	cout<<"sizeof(long long): "<<sizeof(long long)<<endl;
    	cout<<"sizeof(string): "<<sizeof(string)<<endl;//相当于一个指针 
    	
    	int an_int = 4;
    	cout<<"sizeof(an_int): "<<sizeof(an_int)<<endl;
    	
    	/*一个string变量的大小与它所指的字符串的长度无关,
    	  可以这样理解:string变量名是一个指针 
    	*/
    	string str1 = "Hello";
    	string str2 = "HelloWorld";
    	cout<<"sizeof(str1): "<<sizeof(str1)<<endl; 
    	cout<<"sizeof(str2): "<<sizeof(str2)<<endl;
    	
    	/*直接传一个字符串进去如何:
    	 会把它当成是char数组,并且''也算进长度中.
    	*/
    	cout<<"sizeof("Hello"): "<<sizeof("Hello")<<endl;//  :用作转义符 
    	
    	//要计算数组的长度,必须除去数组单个元素的字节数 
    	cout<<"sizeof(array) / sizeof(array[0]): "<<sizeof(array) / sizeof(array[0])<<endl;
    	
    	//求一个指针的字节数,32位编译环境下是4字节,64bit的为8字节 
    	cout<<"sizeof(pionter): "<<sizeof(pionter)<<endl;
    	
    	function(array);
    	
    	return 0;
    }
    /**
    编译环境:TDM-GCC 4.8.1 32-bit Release 
    
    输出: 
    sizeof(array): 12
    sizeof(int): 4
    sizeof(int&): 4
    sizeof(short): 2
    sizeof(short&): 2
    sizeof(short*): 4
    sizeof(char): 1
    sizeof(double): 8
    sizeof(float): 4
    sizeof(long): 4
    sizeof(long long): 8
    sizeof(string): 4
    sizeof(an_int): 4
    sizeof(str1): 4
    sizeof(str2): 4
    sizeof("Hello"): 6
    sizeof(array) / sizeof(array[0]): 3
    sizeof(pionter): 4
    function: 4
    
    编译环境:TDM-GCC 4.8.1 64-bit Release 
    sizeof(array): 12
    sizeof(int): 4
    sizeof(int&): 4
    sizeof(short): 2
    sizeof(short&): 2
    sizeof(short*): 8
    sizeof(char): 1
    sizeof(double): 8
    sizeof(float): 4
    sizeof(long): 4
    sizeof(long long): 8
    sizeof(string): 8
    sizeof(an_int): 4
    sizeof(str1): 8
    sizeof(str2): 8
    sizeof("Hello"): 6
    sizeof(array) / sizeof(array[0]): 3
    sizeof(pionter): 8
    function: 8
    输出:
    */


    Windows命令行怎么复制内容:

    标记  -->  选定内容  --> Enter,然后内容就会被放到剪贴板了。

  • 相关阅读:
    使用Vim写LaTeX代码(Vim+Vimtex+Skim)
    如何安装vim自动补全插件YouCompleteMe(YCM)
    我的vimrc配置
    囚徒问题(100 prisoners problem)的python验证
    tomcat下运行多个项目
    转使用chrome命令行:disable-web-security 实现浏览器跨域
    Spring Session
    nodejs 之 nvm和pm2
    chrome地址栏命令
    Koa2和相关资料
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586375.html
Copyright © 2011-2022 走看看