c# - 从C++到C#//结构内存优化

标签 c# c++

@Zbyl 我在这个帖子中看到了你的答案 ( Bit fields in C# ) 我真的很喜欢 Bitvector32 方法,但出于优化目的:如果我有大量大小为 8 位/12 位(小于 32 位)的结构怎么办,是否可以以比 Bitvector32 更少的方式进行操作,因为那将是大量永远不会被使用的夸张内存分配:我将只使用 Bitvector32 的前 8 位。 这是我想在 C# 中制作的结构示例:

   struct iec_qualif
{
    unsigned char var :2;
    unsigned char res :2;
    unsigned char bl :1; // blocked/not blocked
    unsigned char sb :1; // substituted/not substituted
    unsigned char nt :1; // not topical/topical
    unsigned char iv :1; // valid/invalid
};

最佳答案

首先,我会考虑您实际处理的结构数量。今天配备 GB 内存的硬件应该能够轻松处理数千个结构,即使您为每个结构浪费三个字节(1 000 000 个结构将占用 4 MB 的潜在 > 1000 MB 可用空间)。考虑到这一点,您甚至可以完全没有位字段,每个字段只有正常字节(但是您的 setter 应该检查范围),导致 6 个字节而不是四个(可能还有两个用于对齐问题),但让您可以更快地访问值( setter/getter ),因为不需要任何摆弄。

另一方面:位域最终不过是让编译器编写您必须自己编写的代码的一种便捷方式。但是稍加练习,自己处理这些位并不是一件太困难的任务,请参阅 this answer在您自己提到的主题中(“手工访问器”部分),在内部将所有数据存储在 byte 类型的变量中,并通过位移和掩码访问它。

关于c# - 从C++到C#//结构内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787374/

相关文章:

c# - 可以增强十字光标吗?

c# - 将第一个 ListBoxItem 的高度设置为 WP7 中其他项目的差异

c# - 什么是 Template10 导航服务的 NavigationServices.FirstOrDefault()?

c# - 从 C# 启动 jar

c# - Visual Studio 发布 Web 部署出现 ERROR_USER_NOT_ADMIN 错误

c++ - OpenCV:CvBox2D 角度

c++ - 如何用头文件确定函数定义?

c++ - QT:如何根据 SpinBox 的值提高/降低标签的值

c++ - 重新检查时指针属性发生变化

c++ - 位 c 操作