通常,使用有意义的类型。从数据验证、完整性和持久性的角度来看,这可能是有帮助的。
例如,通常情况下,由于填充和对齐问题,bool在32位体系结构上实际消耗4字节,在64位体系结构上可能消耗8字节。默认情况下,大多数编译器都会优化速度,而不是代码大小或内存使用量。对齐访问通常比非对齐访问更快。在.Net中,其中一些可以通过属性进行控制。据我所知,JIT编译器不会将多个布尔类型压缩到一个整数位字段中。
对于byte类型也是如此。JIT编译器可以压缩多个字节类型(甚至重新安排存储顺序)以共享相同的字(假设您不使用StructLayout和FieldOffset等属性覆盖此类行为)。
例如:
代码语言:javascript运行复制struct Foo
{
string A;
short B;
string C;
short D;
}将引用类型视为指针,上面的大小可能是16 (可能是14,但对齐到16)。
可以重新排列Foo,使其实际顺序为:
代码语言:javascript运行复制struct Foo
{
string A;
string C;
short B;
short D;
}上面的大小可能为12,对齐方式为12或16 (可能为16)。
...potentially,在这个人工设计的示例中,由于重新排列,您可以节省4个字节。请注意,与典型的C++编译器相比,.Net在重新对齐成员方面更加积极。
(顺便说一句,我最近花了一些精力在我维护的一个C++库上。我能够完全通过优化成员布局来实现55%的内存使用减少)。