如何让MSVC将未初始化的数据放入.bss?

Dan*_*amp 7 c c++ visual-c++

我正在使用自定义构建系统(在Visual Studio外部)构建DLL,并且我无法获得未初始化的数据以显示在该.bss部分中; 编译器把它归结为.data.这膨胀了最终的二进制大小,因为它充满了巨大的零数组.

例如(示例中的小1KB数组,但实际缓冲区要大得多):

int uninitialized[1024];
int initialized[1024] = { 123 };
Run Code Online (Sandbox Code Playgroud)

编译器发出如下所示的程序集:

PUBLIC  _initialized
_DATA   SEGMENT
COMM    _uninitialized:DWORD:0400H
_initialized DD 07bH
    ORG $+4092
_DATA   ENDS
Run Code Online (Sandbox Code Playgroud)

最终在目标文件中如下所示:

SECTION HEADER #3
   .data name
       0 physical address
       0 virtual address
    1000 size of raw data
     147 file pointer to raw data (00000147 to 00001146)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0400040 flags
         Initialized Data
         8 byte align
         Read Write
Run Code Online (Sandbox Code Playgroud)

(没有.bss部分.)

当前的编译标志:

cl -nologo -c -FAsc -Faobjs\ -W4 -WX -X -J -EHs-c- -GR- -Gy -GS- -O1 -Os -Foobjs\file.o file.cpp
Run Code Online (Sandbox Code Playgroud)

我查看了http://msdn.microsoft.com/en-us/library/fwkeyyhe(v=vs.71).aspx上的选项列表,但我没有发现任何明显的问题.

我正在使用Visual Studio 2008 SP1中的编译器(Microsoft(R)32位C/C++优化编译器版本15.00.30729.01 for 80x86).

Nec*_*lis 2

您想要使用__declspec(allocate()),您可以在此处阅读:https://learn.microsoft.com/en-us/cpp/cpp/allocate? view=msvc-170

为了更深入地了解__declspec(allocate()),Raymond Chen 在此处发表了一篇博客文章: https: //devblogs.microsoft.com/oldnewthing/20181107-00/ ?p=100155