对于共享内存的操作涉及到__based指针,但有点疑问.
ShareMem* gShareMem;
struct gShareMem
{
   int nStrCount;
   char __based(gShareMem)* m_pStr[1];
};
gShareMem=(ShareMem*)new char[1000];//直接模拟共享内存有一个问题就是,对于常量的转换,倒是正好说明其定义:__based允许指针被定义为从某一点开始起算的32位偏移,而不是内存中的绝对值,真正处理数据时,cpu都必须加上基地址(效率降低)
@1:
int var=3; //假设地址是0x123
int* p=&var;
cout<<(char __based(p)*)0x1<<endl; //这句代码到是正好输出0x124@2:
char* p1="hello,world";
char __based(p)* pTest=NULL;
cout<<(char*)pTest<<endl;      //这代码也按预想的输出hello,world.问题是:根据解释":__based允许指针被定义为从某一点开始起算的32位偏移",但对于一般指针
比如对于@1: 假如又有一个int* p1指针,则cout<<(char __based(p)*)p1<<endl;输出的地址仍为p1的地址(按找定义,我预想结果应该是 p(基地址)+p1(偏移)才对),对于这样的转换,__based指针到底是怎样工作的???

解决方案 »

  1.   

    请参考:
    http://topic.csdn.net/t/20040909/09/3354657.html
      

  2.   

    char __based(p1)* pTest=NULL;
      

  3.   

    嗯 这个上面是直接手写的,也没注意 - -
    呵呵 好久没上了,上来把贴结了.我反汇编查看,发现对于指针(如果作为一个变量来存储)的话其所谓的转换没有发送任何变化,就是Mov,push等操作,没有任何Add,inc等指令码
    但如果是常量,比如3,即使(char*)3转换后,其汇编指令又是不同,里面有直接的Add指令增加操作所以结论是:对于常量地址和变量指针(似乎@2那种特殊情况除外) 其转换为char __based(base)*时候其处理方式不同.