Memory C++/CLI结构/类对齐

Memory C++/CLI结构/类对齐,memory,c++-cli,Memory,C++ Cli,似乎我无法使C++/CLI结构的对齐长度小于8字节。我有一个由两个Int32组成的结构,分配了一百万个Int32,瞧,根据“.NET内存分析器”(加上列表数据)有16MB内存。我将编译器选项设置为/Zp4(也尝试了/Zp1),以最小化大小(/O1)和小代码(/Os),只是为了确保在代码中添加了一个“#pragma pack(1)”,但没有效果。我的结构仍然占用16个字节。我把它改成了班级,还是一样 为什么? 如何改变 再见, 艾克 使用名称空间系统; #布拉格语包(1) ref struct m

似乎我无法使C++/CLI结构的对齐长度小于8字节。我有一个由两个Int32组成的结构,分配了一百万个Int32,瞧,根据“.NET内存分析器”(加上列表数据)有16MB内存。我将编译器选项设置为/Zp4(也尝试了/Zp1),以最小化大小(/O1)和小代码(/Os),只是为了确保在代码中添加了一个“#pragma pack(1)”,但没有效果。我的结构仍然占用16个字节。我把它改成了班级,还是一样

为什么? 如何改变

再见, 艾克

使用名称空间系统;
#布拉格语包(1)
ref struct myStruct
{
Int32A;
int32b;
};
int main(数组^args)
{
系统::集合::通用::列表;
对于(int i=0;i<1000000;i++)
{
添加(gcnewmystruct());
}
//避免优化
控制台::WriteLine(列表[333333]->a);
返回0;
}

您需要使用值类型才能指定对齐方式。除此之外,我不确定这是最好的衡量方法。引用类型也有一些小的内置开销。试试value struct/value class。

我很高兴有更好的方法来衡量内存使用情况。无论是C++还是siopf()还是互操作::MARHAL::siZeFor()用于REF结构。如果需要这样做,不要使用引用类型。CLR可以而且确实在其中添加了额外的内容(头文件、vtables等),可惜我无法在.NET中更改对齐方式,但是值结构(我还不知道)可能会对我有所帮助。
using namespace System;
#pragma pack(1)

ref struct myStruct
{
    Int32 a;
    Int32 b;
};

int main(array<System::String ^> ^args)
{
    System::Collections::Generic::List<myStruct^> list;
    for (int i = 0; i < 1000000; i++)
    {
        list.Add(gcnew myStruct());
    }
    // avoid optimization
    Console::WriteLine(list[333333]->a);
    return 0;
}