C#中的指针问题!

cd7809 2002-04-14 09:59:46

.NET 中通常会给某些数据类型加上一些空间, 使他们占据的内存是4字节的倍数,

比如short X = 10; 那么变量X应该占用4个字节的内存,

我的问题是short pX = &X; 当++pX;的时候,指针是向上移动4个字节,还是2个?
...全文
34 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqchen79 2002-04-15
  • 打赏
  • 举报
回复
计算最好采用和CPU寄存器相同的宽度,内存读取最好采用和总线相同的宽度,
在32位上8/16/32位都一样。
是32位CPU选择了处理数据的速度,而不是相反。
cd7809 2002-04-15
  • 打赏
  • 举报
回复

非常感谢!
cd7809 2002-04-14
  • 打赏
  • 举报
回复

那么我的理解就是cpu最好按照8位计算,这样速度快,

而32位和8位速度完全相同, 所以采用了32位,而16位就不一样了对吧,

如果是这样的话,我还有两点不明白,

一是为什么8位计算速度就比16快呢,而32位和8位一样?

二是速度是选择32的唯一原因吗?

谢谢!
qqchen79 2002-04-14
  • 打赏
  • 举报
回复
.NET是32位的,出于跨平台考虑,即使在64位的系统上.NET自身也还是32位。
我前面说了在内存中的时候系统总是尽量采用最紧密的排列方式,不轻易的加入用于对齐的附加字节,不会有很多的内存浪费。但也不保证和你书写的顺序一致。
运算过程必须保持32位是可以理解的,在32位的CPU上8位加法和32位加法速度完全相同,总线级的内存读取也是32位,也就是说读32位数据和8位没区别。
cd7809 2002-04-14
  • 打赏
  • 举报
回复

说的好,

不过我就不明白的是c#到底是64bit还是32bit, 应该是64bit吧,不过这样的

话我储存一个short就要占8个字节??

这能反映出c#的好处吗?
qqchen79 2002-04-14
  • 打赏
  • 举报
回复
short* pX = &X;
++ pX;
应该是移动两个字节的。因为在数组里short的存储是compact的,不然台浪费空间了。
除了数组以外,只有指定类StructLayout的valuetype里可以使用上面的方法,对于其它情况(比如函数的local variable)不行,因为中间还有一层JIT,可能会调整内存的结构,不能对此有任何假设。

.NET里明确规定的内存填充是在Evaluat Stack上,也就是说,不过什么类型的数据,load到求值堆栈上至少要占4bytes,对于在heap和local var的内存情况,.NET没有规定。另外,影响空间Pack/Align的因素还有很多,比如CPU,64位通常采用8bytes的Align,32位通常是4bytes的Align。
cd7809 2002-04-14
  • 打赏
  • 举报
回复

对不起, 写错了,是short *pX = &X;

TO : lonk(小鱼)

有啊, 在《c#高级编程》的282页写着。







lonk 2002-04-14
  • 打赏
  • 举报
回复
为什么要在c#中用指针呢?对于简单数据类型,我没听说过占用的内存
被弄成是4字节的倍数.

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧