• 请不要在回答技术问题时复制粘贴 AI 生成的内容
youla
V2EX  ›  程序员

为什么 64 位程序执行同样的代码,比 32 位程序占用的内存要多(自己测试将近一半)?

  •  
  •   youla · Dec 3, 2020 · 5652 views
    This topic created in 2170 days ago, the information mentioned may be changed or developed.
    //测试用到的代码
    
    Task.Factory.StartNew(() =>{
    	for (int i = 0; i < 999999; i++){
    		int len = 255;
    		IntPtr ptr = Marshal.AllocHGlobal(len);
    		QueryFullProcessImageName(-1, 0, ptr, ref len);
    		Console.WriteLine(Marshal.PtrToStringUni(ptr));
    		Marshal.FreeHGlobal(ptr);
    	}
    });
    
    

    DoXD4P.jpg

    门外汉

    坐等摸鱼大佬

    22 replies  •  2020-12-03 19:50:00 +08:00
    longaiwp
    longaiwp
    Dec 3, 2020
    1
    这难道不是意料之中的事情吗?你的问题是为什么会增加还是为什么会增加一半?
    0x2CA
    0x2CA
    Dec 3, 2020❤️6
    2
    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 个字节
    shawndev
    shawndev
    Dec 3, 2020
    3
    相同的数据类型会占用更多的内存空间
    Jooooooooo
    Jooooooooo
    Dec 3, 2020
    4
    你原来用 北京市-朝阳区 定位人

    现在用 中国-北京市-朝阳区-望京 定位人

    写出来占空间更大了吧
    youla
    youla
    OP
    Dec 3, 2020
    5
    如果可以还想问一下,上面的代码写的有问题没??和下面这样写哪个好点???

    int len = 255;
    char[] data=new char[len];
    QueryFullProcessImageName(-1, 0, data, ref len);
    Console.WriteLine(new string(data,0,data.Length).TrimEnd('\0'));
    codehz
    codehz
    Dec 3, 2020 via Android❤️5
    6
    显然指针的大小的变化不至于导致 heap alloc 的大小同比例增加,这里的原因是 x64 本身运行时环境自带的 overhead,不过不用担心,很大一部分都是由于调试需要才造成的,release 版本不会相差很多
    jasonkayzk
    jasonkayzk
    Dec 3, 2020
    7
    x86 和 x64 的指针大小都是不一样的;
    NNS71L068O2v70DB
    NNS71L068O2v70DB
    Dec 3, 2020
    8
    指针大小不一致,基础数据类型比如 int 在两个平台上大小不一致,另外我比较好奇,如果是像 go 那种,全部是什么 int32 这种的话。大小会是什么变化
    ysc3839
    ysc3839
    Dec 3, 2020 via Android❤️1
    9
    @youla C# 我不熟悉,但是 C++ 的话是会避免自己 new 之后再拷贝的,比如要把结果保存到 std::string 中的话,会直接 string.resize() 分配空间,然后用 string.data() 获取数据指针,然后直接写进去。
    lxilu
    lxilu
    Dec 3, 2020
    10
    直接 String/Builder 就行
    @0x2CA 看清楚啊,这是 C#,简单类型尺寸固定,指针随平台。
    f6x
    f6x
    Dec 3, 2020
    11
    硬盘++, 内存+
    耗时-

    你选吧.
    Jasmine2016
    Jasmine2016
    Dec 3, 2020
    12
    这要从计算机原理说起。。
    qinyusen
    qinyusen
    Dec 3, 2020
    13
    去年给校招出的题目就是考察这个的。。。供参考
    填空题和简答题
    1.对于 32 位系统 sizeof(int) 的值等于`__________`

    5 在一个 64 位或 32 操作系统中以下代码输出的结果是(多选)?
    ```
    std::cout<<sizeof(NULL)<<sizeof("NULL")<<std::endl;
    ```
    A 88
    B 85
    C 44
    D 45

    7. 写出运行结果:

    // test1
    char str[] = "world";
    cout << sizeof(str) << ": ";
    char *p = str;
    cout << sizeof(p) << ": ";
    char i = 10;
    cout << sizeof(i) << ": ";
    void *pp = malloc(10);
    cout << sizeof(pp) << endl;

    `__________`
    dream4ever
    dream4ever
    Dec 3, 2020
    14
    别的不说,这增加的是一倍吧?不是一半吧? 10 * 200% = 20,而不是 10 * 150% = 20
    ragnaroks
    ragnaroks
    Dec 3, 2020
    15
    这个测试不妥当,我有个 dotnet core 的控制台应用程序,32 位下 17M 内存,64 位下 21M,个人理解也就指针占用多了点,其它应该完全相同
    nuk
    nuk
    Dec 3, 2020
    16
    没看出来这样测试有啥意义,都没分配多少内存,差的就是运行时用的内存吧,起码 GC 里保存的都是 64 位的地址?
    ysc3839
    ysc3839
    Dec 3, 2020 via Android
    17
    @qinyusen 这第五题有问题吧? NULL 具体实现是看编译器的,有的编译器就只是一个 0,此时类型是 int,长度为 4 。
    dadachen1997
    dadachen1997
    Dec 3, 2020
    18
    因为指针的长度 double 了,在现代的语言里面,每个 object 的 header 包含的指针太多了,基本上 32 到 64 空间占用会多 80%
    XDy0
    XDy0
    Dec 3, 2020❤️1
    19
    经典面试题。。指针压缩。。。
    qinyusen
    qinyusen
    Dec 3, 2020
    20
    @ysc3839 对,但是选择题,不是填空,所以,只要知道说的是啥就行
    youla
    youla
    OP
    Dec 3, 2020
    21
    @ysc3839 谢谢,我好像忽然感受到一点区别了。
    muzuiget
    muzuiget
    Dec 3, 2020
    22
    内存地址长度也是 64 位啊。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2571 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 11:21 · PVG 19:21 · LAX 03:21 · JFK 06:21
    ♥ Do have faith in what you're doing.