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

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

  •  
  •   TESTFLIGHT2021 · Oct 16, 2023 · 1825 views
    This topic created in 939 days ago, the information mentioned may be changed or developed.
    如题,请教一下~~
    12 replies    2023-10-17 11:32:25 +08:00
    tool2d
        1
    tool2d  
       Oct 16, 2023
    stack 肯定有啊,编译器参数里就有。heap 一般是系统维护的,不能自己设置。

    感觉问一下 gpt ,比发帖等回复要快。
    cnbatch
        2
    cnbatch  
       Oct 16, 2023
    tool2d
        3
    tool2d  
       Oct 16, 2023
    @cnbatch 感觉 windows 设置堆大小没意义吧。内存页面增长大小都是 OS 进行管理的,exe 总占用内存也是系统剩余内存多少决定的。
    cnbatch
        4
    cnbatch  
       Oct 16, 2023
    @tool2d 大多数情况下,确实没谁想过设置堆的值,只是 OP 想故意设限,那就由他吧╮(╯-╰)╭
    TESTFLIGHT2021
        5
    TESTFLIGHT2021  
    OP
       Oct 16, 2023
    @tool2d 32 位应用寻址空间<4G stack 起始 结束 应该有限制吧
    TESTFLIGHT2021
        6
    TESTFLIGHT2021  
    OP
       Oct 16, 2023
    @cnbatch https://learn.microsoft.com/en-us/cpp/build/reference/stack-stack-allocations?view=msvc-170 按照这个 stack 大小是 1MB 但是实际好像没管过这个,或者可能超过这个值了,好像也没问题啊?
    cnbatch
        7
    cnbatch  
       Oct 16, 2023
    @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
       Oct 16, 2023
    @cnbatch 我试试 我平日都是 new delete new 有时候好几 MB 的空间。。。好像也没出问题
    liuhan907
        9
    liuhan907  
       Oct 16, 2023
    @TESTFLIGHT2021 new 那是堆空间当然没问题
    labubu
        10
    labubu  
       Oct 17, 2023
    vs 在项目设置里面有
    lff0305
        11
    lff0305  
       Oct 17, 2023
    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
       Oct 17, 2023
    @lff0305 创建的线程 stack 和主线程可以不一样?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4991 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 09:47 · PVG 17:47 · LAX 02:47 · JFK 05:47
    ♥ Do have faith in what you're doing.