为什么内存地址是偶数?

时间:2014-02-04 20:15:15

标签: c++ c pointers memory

在VS调试器中注意到内存地址通常是偶数后我尝试了以下程序(MS Visual Studio 2012)

struct noise {
    int data[3];
};

int _tmain(int argc, _TCHAR* argv[])
{   
    std::vector<noise*> vn; 
    std::vector<std::complex<double>*> vv;

    for (int i(0); i < 90000; ++i) {
        std::complex<double> *cur = new std::complex<double>(1, 1);
        assert( ! ((int)cur&1) ); // assert if adress is not even
        vv.push_back(cur);
        if ( ! (i% (rand()%5 + 1)) ) vn.push_back(new noise);
    }

    for (std::size_t i(0), ie(vv.size()); i < ie; ++i) { delete vv[i]; }
    for (std::size_t i(0), ie(vn.size()); i < ie; ++i) { delete vn[i]; }

    system("PAUSE");
    return 0;
}

永远不会断言!怎么会这样?有没有办法让它断言?这有什么用途可以作为副作用吗?

1 个答案:

答案 0 :(得分:20)

处理器(以及编译器)通常将数据称为“aligned”,其粒度高于字节。例如,由于32位处理器处理的是32位块中的数字,而不是8位块,因此在32位(4字节)边界上对齐事物会更有效。实际上,某些处理器甚至需要一定程度的对齐。

对齐还有很多其他原因,例如防止单词跨越多个内存页面。编译器通常会在数据结构中插入填充,以便结构的每个成员都对齐到某个倍数(通常为2的幂)。大多数编译器还允许您更改对齐设置(使用#pragma)。