2015-02-10 36 views
0

我正在测试一些使用指针算法的代码,但我不明白我得到什么格式的大小。 我假设sizeof以机器字(char == 1机器字的大小)为单位给出了我的大小,但返回的指针地址之间的差异是什么单位?指针地址之间的差异

我使用VS2008和x64 win7和x64编译器。

void test_pointer_delta() 
{ 
    int sum=0; 
    int n= 100000; 
    for(int i=0;i<n;++i) 
    { 
     char* p1= new char; 
     char* p2= new char; 
     sum += p2-p1; 
    } 
    double dp= (double)sum/n; //~64 
    int sz= sizeof(char);//1 
    int p_sz= sizeof(char*);//8 
    printf("diff: %f \n",dp); 
} 

什么是64? 64位? (所以x64系统上字长为64位?)

编辑: 我想用这个“绝招”,以测试多少内存载体使用,因为它似乎它不释放所有内存(根据任务管理器的一些少量残留) 这里是测试代码:

void test_containers() 
{ 
    int N=1000*1000; 

    int temp= 10; 
    clock_t t; 

    //for(int i=0;i<100;++i) 
    { 
     t= clock(); 
     //vector 
     std::vector<int> vec; 
     for(int i=0;i<N;++i) 
     { 
      vec.push_back(temp); 
     } 
     t= clock()-t; 
     printf("vec: %d tics , %f sec \n",t, ((float)t)/CLOCKS_PER_SEC); 

     //clear vec 
     t= clock(); 
     vec.clear(); //not frees memory of vector just makes size = 0 
     std::vector<int>(vec).swap(vec); //swap trick frees memory 
     t= clock()-t; 
     printf("vec clear: %d tics , %f sec \n",t, ((float)t)/CLOCKS_PER_SEC); 

     int c= vec.capacity(); 
     int sz= vec.size(); 
    } 
} 

    //assume dp1 should be the same as dp2 
    char* p1 = new char; 
    char* p2 = new char; 
    int dp1= p2-p1; 
    test_containers(); 
    char* p3= new char; 
    int dp2= p3-p2; 
+5

您的代码表现出不确定的行为。减去两个指针只有在指向同一个数组时才有意义(在这种情况下,差异是它们之间的距离,数组元素的数量)。 – 2015-02-10 14:58:10

+1

'new'的结果是不可预测的。 'sum'可以是任何东西。 – molbdnilo 2015-02-10 15:18:22

回答

1

类型减去两个指示标记的结果是:std::ptrdiff_t。两个指针T *之差的单位是T个元素的个数。

2

我认为,如果你试试这个代码,你会得到你的答案:

char s[10]; 
char *p1 = &s[0]; 
char *p2 = &s[1]; 
std::cout << p2 - p1;