用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分 高手来拿吧~~~~~~~~~~~~

解决方案 »

  1.   

    在MSDN中有一下代码:
    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.   

    1C# code    *((int*) dmem)这个写法是神马意思??获取地址在dmem的整数变量值
    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
      

  3.   


    1.
    那为什么我的那个程序无法获得正确的整数变量值
    3.
    一次取2个的话 只要while步长2不是就可以了吗
      

  4.   

    1
    结果为:
    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
      

  5.   


    对8取余我知道,我不明白是的为什么是对8取余 而不是对16 或者 32要不就直接对2取余更直接,一个while就可以解决了
      

  6.   

    *((int*) dmem) = *((uint*) smem);
    dmem[0] = smem[0];这2行代码其实是同一个意思
    但是肿么会在同一个方法里出现2种写法??我在心目中微软的程序员写的代码应该是最牛逼的,最标准的,最有效率的
    这个难道就标准吗???
      

  7.   

    在微博遇到1高手解答:
    这个是32位和64位对指针的处理的区别:32位知道指针目标位置是啥,所以不会溢出,64位不检查指针目标位置是什么,直接按类型大小取值。意思应该是 虽然是int类型的指针,但在32位下,会判断指针指向的内存到底是什么类型的(如果是char只取8位的值)
    而64位下就,只要是int类型的值就直接取32位的值,所以才会这么大,但是低8位永远是1011010.代表90
      

  8.   

    在微博遇到1高手解答:
    这个是32位和64位对指针的处理的区别:32位知道指针目标位置是啥,所以不会溢出,64位不检查指针目标位置是什么,直接按类型大小取值。意思应该是 虽然是int类型的指针,但在32位下,会判断指针指向的内存到底是什么类型的(如果是char只取8位的值)
    而64位下就,只要是int类型的值就直接取32位的值,所以才会这么大,但是低8位永远是1011010.代表90---与君共勉