用Reflector反射string的一段代码如下
:private static unsafe void wstrcpyPtrAligned(char* dmem, char* smem, int charCount)
{
while (charCount >= 8)
{
*((int*) dmem) = *((uint*) smem);
*((int*) (dmem + 2)) = *((uint*) (smem + 2));
*((int*) (dmem + 4)) = *((uint*) (smem + 4));
*((int*) (dmem + 6)) = *((uint*) (smem + 6));
dmem += 8;
smem += 8;
charCount -= 8;
}
if ((charCount & 4) != 0)
{
*((int*) dmem) = *((uint*) smem);
*((int*) (dmem + 2)) = *((uint*) (smem + 2));
dmem += 4;
smem += 4;
}
if ((charCount & 2) != 0)
{
*((int*) dmem) = *((uint*) smem);
dmem += 2;
smem += 2;
}
if ((charCount & 1) != 0)
{
dmem[0] = smem[0];
}
}从字面上猜测 应该是 把 smem 中的数据 复制到dmem中,长度为charCount
有几个写法不理解
1
*((int*) dmem) 这个写法是神马意思??
2
为什么跳过+3+5+7阶段??
3
为什么分为while(8) if(4) if(2) if(1) 4个代码块? 只有一个步长为(1)的while不行吗?
4//为什么要用
if ((charCount & 4) != 0)
//而不用
if(charCount >= 4)4个问题 一个25分 高手来拿吧~~~~~~~~~~~~
:private static unsafe void wstrcpyPtrAligned(char* dmem, char* smem, int charCount)
{
while (charCount >= 8)
{
*((int*) dmem) = *((uint*) smem);
*((int*) (dmem + 2)) = *((uint*) (smem + 2));
*((int*) (dmem + 4)) = *((uint*) (smem + 4));
*((int*) (dmem + 6)) = *((uint*) (smem + 6));
dmem += 8;
smem += 8;
charCount -= 8;
}
if ((charCount & 4) != 0)
{
*((int*) dmem) = *((uint*) smem);
*((int*) (dmem + 2)) = *((uint*) (smem + 2));
dmem += 4;
smem += 4;
}
if ((charCount & 2) != 0)
{
*((int*) dmem) = *((uint*) smem);
dmem += 2;
smem += 2;
}
if ((charCount & 1) != 0)
{
dmem[0] = smem[0];
}
}从字面上猜测 应该是 把 smem 中的数据 复制到dmem中,长度为charCount
有几个写法不理解
1
*((int*) dmem) 这个写法是神马意思??
2
为什么跳过+3+5+7阶段??
3
为什么分为while(8) if(4) if(2) if(1) 4个代码块? 只有一个步长为(1)的while不行吗?
4//为什么要用
if ((charCount & 4) != 0)
//而不用
if(charCount >= 4)4个问题 一个25分 高手来拿吧~~~~~~~~~~~~
unsafe class TestClass
{
static void Main()
{
char theChar = 'Z';
char* pChar = &theChar;
void* pVoid = pChar;
int* pInt = (int*)pVoid; System.Console.WriteLine("Value of theChar = {0}", theChar);
System.Console.WriteLine("Address of theChar = {0:X2}",(int)pChar);
System.Console.WriteLine("Value of pChar = {0}", *pChar);
System.Console.WriteLine("Value of pInt = {0}", *pInt);
}
}示例输出
注意,theChar 的地址在不同的运行中是不同的,因为分配给变量的物理地址可能会更改。Value of theChar = Z Address of theChar = 12F718 Value of pChar = Z Value of pInt = 90 看上去 (*(int*)&theChar) 似乎是得到了char的值90
但是我复制代码后运行却得到以下结果:Value of theChar = Z
Address of theChar = 1CFEDF30
Value of pChar = Z
Value of pInt = 691011674 <---- 我当时就凌乱啦~~~
2
为什么跳过+3+5+7阶段??
每次取2个字节,所以不需要+3+5+73
为什么分为while(8) if(4) if(2) if(1) 4个代码块? 只有一个步长为(1)的while不行吗?同2,4C# code //为什么要用 if ((charCount & 4) != 0) //而不用 if(charCount >= 4)
也可以使用charCount>=4
1.
那为什么我的那个程序无法获得正确的整数变量值
3.
一次取2个的话 只要while步长2不是就可以了吗
结果为:
Value of theChar = Z
Address of theChar = 43EE504
Value of pChar = Z
Value of pInt = 90
Value of pInt = 903
对8求余
判断长度是否为4+,为2+, 为1,按顺序进行判断,所以不用 while步长2
对8取余我知道,我不明白是的为什么是对8取余 而不是对16 或者 32要不就直接对2取余更直接,一个while就可以解决了
dmem[0] = smem[0];这2行代码其实是同一个意思
但是肿么会在同一个方法里出现2种写法??我在心目中微软的程序员写的代码应该是最牛逼的,最标准的,最有效率的
这个难道就标准吗???
这个是32位和64位对指针的处理的区别:32位知道指针目标位置是啥,所以不会溢出,64位不检查指针目标位置是什么,直接按类型大小取值。意思应该是 虽然是int类型的指针,但在32位下,会判断指针指向的内存到底是什么类型的(如果是char只取8位的值)
而64位下就,只要是int类型的值就直接取32位的值,所以才会这么大,但是低8位永远是1011010.代表90
这个是32位和64位对指针的处理的区别:32位知道指针目标位置是啥,所以不会溢出,64位不检查指针目标位置是什么,直接按类型大小取值。意思应该是 虽然是int类型的指针,但在32位下,会判断指针指向的内存到底是什么类型的(如果是char只取8位的值)
而64位下就,只要是int类型的值就直接取32位的值,所以才会这么大,但是低8位永远是1011010.代表90---与君共勉