我如何让MSVC把未初始化的数据在.bss
How do I get MSVC to put uninitialized data in .bss?
我正在使用自定义构建系统(Visual Studio之外)构建DLL,并且我无法获得未初始化的数据以显示在.bss
部分;编译器将其集中到.data
中。这会增大最终二进制的大小,因为它充满了巨大的零数组。
例如(示例中为1KB的小数组,但实际缓冲区要大得多):
int uninitialized[1024];
int initialized[1024] = { 123 };
编译器发出这样的程序集:
PUBLIC _initialized
_DATA SEGMENT
COMM _uninitialized:DWORD:0400H
_initialized DD 07bH
ORG $+4092
_DATA ENDS
在目标文件中以如下方式结束:
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
(没有.bss
段)
当前编译标志:
cl -nologo -c -FAsc -Faobjs -W4 -WX -X -J -EHs-c- -GR- -Gy -GS- -O1 -Os -Foobjsfile.o file.cpp
我已经浏览了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)。
注意,"原始数据的大小"仅为0x1000或4kB—正好是初始化数组的大小。data部分的VirtualSize将大于二进制图像中存储的实际数据的大小,并且未初始化的数组将占用空闲空间。使用bss_seg pragma将强制链接器将未初始化的数据放在它自己单独的节中。
您想使用__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
如果您不关心可移植性,您可以尝试使用bss_seg pragma
- 如何使用数据对象上的常量指针初始化类
- 如何在 malloc 内存中初始化非 POD 数据
- 内联静态数据的初始化
- 是否可以使用右值初始化数据成员?
- 构造函数正在初始化数据成员
- 初始化数据成员取决于构造函数中的条件
- openGL如何处理发送给它的空/未初始化数据?
- 如何在C 11中正确初始化数据成员
- 在具有初始化的声明中,是否可以使用对未初始化数据的引用
- 使用值初始化的数组对零初始化数据
- 在C++中,如果我们不在构造函数中初始化数据成员,那么类中数据成员的值会是多少
- 为什么我们需要构造函数 C++,我们可以通过函数(初始化数据或访问私有数据成员)来做同样的事情
- 正在初始化数据文件中的静态常量成员
- 用成员函数初始化数据成员
- 在不初始化数据的情况下调整 std::vector C++的大小<char>
- 尝试在构造函数中初始化数据成员,但失败.为什么
- 在c++中使用初始化列表初始化数据成员引用
- 如何创建一个可以初始化c++数据类型的类
- 当初始化数据类型char*和非char*时
- 代码是否被视为可移植可执行文件格式中的初始化数据,初始化数据和单元化数据之间的确切区别是什么