【发布时间】:2013-03-05 16:27:52
【问题描述】:
我知道如果我有一个数组int A[512],那么引用 A 可以指向第一个元素。在指针算法中,内存被引用为A + index。
但如果我没记错的话,指针/引用也会占用机器字的空间。假设一个int占用了一个机器字,那是不是意味着上面数组的512个整数占用了513个字的空间呢?
C++ 或 C# 中的对象及其数据成员的真/假是否相同?
更新:哇你们真快。澄清一下,我对 C++ 和 C# 在处理此问题的方式不同以及如何调整对象大小以适应缓存行(如果可能)感兴趣。
更新:我已经意识到指针和数组之间的区别。我知道数组不是指针,并且我上面引用的指针算法仅在数组转换为指针后才有效。但是,我认为这种区别与整个问题无关。我对如何在 C++ 和 C# 中将数组和其他对象存储在内存中感兴趣。
【问题讨论】:
-
对于 C# 来说不止如此,但对于 C++ 则不然。在 C++ 中,数组实际上只是一个指向内存块的指针。但是,在 C++ 中,可能会有其他开销,具体取决于内存的来源。堆有保护块和其他需要考虑的家务。在 C# 中,它更像是一个 C++ 向量——它是一个类,它有一些其他字节的开销。有关所有血腥细节,请参见此处:msdn.microsoft.com/en-us/magazine/cc163791.aspx
-
有没有办法确定 C# 中的开销?我想调整一些对象的大小以完全适合缓存行。
-
那将是编译器/IDE 特定的。除了实验(检查不同大小数组的代码大小)之外,我不确定您将如何检查。
-
任何开销都将特定于 CLR 和垃圾收集器的实现(不同平台上的实现可能不同,并且版本之间会发生变化)。恕我直言,如果您对这些事情有正当顾虑(即它们会对您的解决方案产生明显影响),那么您不应该使用 .net。
-
我会考虑的。不过,跨平台的灵活性和反射能力很有吸引力,所以我很想知道如何处理或管理这种开销,以免严重损害性能。在运行时收集关于我们正在运行的机器的数据似乎可能会有所帮助。我不需要踏板到金属的速度,但我确实想要快速处理很多小物体。
标签: c# c++ arrays memory-management size