V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TESTFLIGHT2021
V2EX  ›  程序员

x86 的 C++程序怎么没地方指定 stack 和 heap 的大小?

  •  
  •   TESTFLIGHT2021 · 2023-10-16 16:35:23 +08:00 · 1287 次点击
    这是一个创建于 403 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,请教一下~~
    12 条回复    2023-10-17 11:32:25 +08:00
    tool2d
        1
    tool2d  
       2023-10-16 16:47:05 +08:00
    stack 肯定有啊,编译器参数里就有。heap 一般是系统维护的,不能自己设置。

    感觉问一下 gpt ,比发帖等回复要快。
    cnbatch
        2
    cnbatch  
       2023-10-16 16:55:03 +08:00
    tool2d
        3
    tool2d  
       2023-10-16 17:00:45 +08:00
    @cnbatch 感觉 windows 设置堆大小没意义吧。内存页面增长大小都是 OS 进行管理的,exe 总占用内存也是系统剩余内存多少决定的。
    cnbatch
        4
    cnbatch  
       2023-10-16 17:07:25 +08:00
    @tool2d 大多数情况下,确实没谁想过设置堆的值,只是 OP 想故意设限,那就由他吧╮(╯-╰)╭
    TESTFLIGHT2021
        5
    TESTFLIGHT2021  
    OP
       2023-10-16 17:34:48 +08:00
    @tool2d 32 位应用寻址空间<4G stack 起始 结束 应该有限制吧
    TESTFLIGHT2021
        6
    TESTFLIGHT2021  
    OP
       2023-10-16 17:36:17 +08:00
    @cnbatch https://learn.microsoft.com/en-us/cpp/build/reference/stack-stack-allocations?view=msvc-170 按照这个 stack 大小是 1MB 但是实际好像没管过这个,或者可能超过这个值了,好像也没问题啊?
    cnbatch
        7
    cnbatch  
       2023-10-16 17:50:46 +08:00
    @TESTFLIGHT2021 确定没问题?

    WIndows MSVC ,试试这段:

    #include <iostream>

    int main()
    {
    char test_stack[1024 * 256 * 2]{};
    test_stack[0] = 'E';
    printf("%s\n", test_stack);
    return 0;
    }

    还有这段:

    #include <iostream>

    int main()
    {
    char test_stack[1024 * 1024 * 2]{};
    test_stack[0] = 'E';
    printf("%s\n", test_stack);
    return 0;
    }

    一个未超出 1M ,另一个远超 1M ,看看有没有问题
    TESTFLIGHT2021
        8
    TESTFLIGHT2021  
    OP
       2023-10-16 18:05:58 +08:00
    @cnbatch 我试试 我平日都是 new delete new 有时候好几 MB 的空间。。。好像也没出问题
    liuhan907
        9
    liuhan907  
       2023-10-16 18:27:26 +08:00
    @TESTFLIGHT2021 new 那是堆空间当然没问题
    daimiaopeng
        10
    daimiaopeng  
       2023-10-17 10:33:24 +08:00
    vs 在项目设置里面有
    lff0305
        11
    lff0305  
       2023-10-17 10:34:03 +08:00
    Win 平台上在 CreateThread 的时候可以设置,

    HANDLE CreateThread(
    [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
    [in] SIZE_T dwStackSize,
    [in] LPTHREAD_START_ROUTINE lpStartAddress,
    [in, optional] __drv_aliasesMem LPVOID lpParameter,
    [in] DWORD dwCreationFlags,
    [out, optional] LPDWORD lpThreadId
    );
    TESTFLIGHT2021
        12
    TESTFLIGHT2021  
    OP
       2023-10-17 11:32:25 +08:00
    @lff0305 创建的线程 stack 和主线程可以不一样?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2807 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:37 · PVG 15:37 · LAX 23:37 · JFK 02:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.