我想处理一个类中的许多整数,所以我将它们列在int*
数组中。
int*[] pp = new int*[]{&aaa,&bbb,&ccc};
然而,编译器用以下EXCUSE:拒绝了上面的代码
>只能在固定语句初始值设定项中获取未固定表达式的地址
我知道我可以更改上面的代码来避免这个错误;然而,我们需要考虑ddd
和eee
将来将加入阵列。
public enum E {
aaa,
bbb,
ccc,
_count
}
for(int i=0;i<(int)E._count;i++)
gg[(int)E.bbb]
Dictionary<string,int>ppp=new Dictionary<string,int>();
ppp["aaa"]=ppp.Count;
ppp["bbb"]=ppp.Count;
ppp["ccc"]=ppp.Count;
gg[ppp["bbb"]]
这些解决方案是有效的,但它们使代码和执行时间更长。
我也希望有一个非官方的编译器补丁或一个新的非官方C#编译器,但我已经很多年没有看到可用的下载了;为我们准备一个似乎很困难。
有没有更好的方法让
- 我不需要对数组
ppp
的计数进行计数 - 如果代码变长,则只有几个字母变长
- 执行时间不会增加太多
- 要将
ddd
和eee
添加到阵列中,只有一个或两个每个新成员的集
.NET运行时是一个托管执行运行时,它(除其他外)提供垃圾收集。NET垃圾收集器(GC)不仅管理内存的分配和释放,而且透明地在"托管堆"中移动对象,阻止在执行此操作时执行代码的其余部分。它还通过将寿命较长的对象移动到一起来压缩(碎片整理)内存,甚至将它们"提升"到堆的不同部分,称为生成,以避免过于频繁地检查它们的状态。
有一堆内存一直在被复制,而你的程序甚至没有意识到这一点。由于垃圾回收是一种在程序执行过程中随时可能发生的操作,因此任何与指针相关的("不安全")操作必须在小范围内完成,方法是告诉运行时使用fixed
关键字"固定"对象。这可以防止GC移动它们,但只能移动一段时间。
在C#中使用指针和unsafe
代码不仅不太安全,而且对于一般的托管语言来说也不太习惯。如果你有C语言背景,你可能会对这些结构感到宾至如归,但C#有一个完全不同的理念:作为C#程序员,你的工作应该是编写可靠、可读和可维护的代码,然后再考虑出于性能原因压缩几个CPU周期。您可以在小函数中不时使用指针,执行一些非常具体、时间关键的代码。但即便如此,在进行此类优化之前,您也有责任对进行评测。即使是最有经验的程序员在分析之前也经常无法预测瓶颈。
最后,关于您的实际代码:
-
我不明白你为什么这么想:
int*[] pp = new int*[] {&aaa, &bbb, &ccc};
会比这更具性能:
int[] pp = new int[] {aaa, bbb, ccc};
在32位机器上,
int
和指针的大小相同。在64位机器上,指针甚至更大。 -
考虑将这些普通的
int
替换为您自己的class
,它将为这些值中的每一个提供一些上下文和额外的功能/数据。创建一个新问题,描述你试图解决的实际问题(你也可以使用代码审查来解决这些问题),你会从更好的建议中受益。