c – 为什么记忆地址是偶数?
发布时间:2020-12-16 03:22:59 所属栏目:百科 来源:网络整理
导读:在VS调试器中注意到内存地址通常是偶数后我尝试了以下程序(MS Visual Studio 2012) struct noise { int data[3];};int _tmain(int argc,_TCHAR* argv[]){ std::vectornoise* vn; std::vectorstd::complexdouble* vv; for (int i(0); i 90000; ++i) { std::co
在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; } 它绝不断言!怎么会这样?有没有办法让它断言?作为副作用,这有什么用途吗? 解决方法
处理器(以及编译器)通常将数据称为“
aligned”,其粒度高于字节.例如,由于32位处理器处理的是32位块中的数字,而不是8位块,因此在32位(4字节)边界上对齐事物会更有效.实际上,某些处理器甚至需要一定程度的对齐.
对齐还有很多其他原因,例如防止单词跨越多个内存页面.编译器通常会在数据结构中插入填充,以便结构的每个成员都对齐到某个倍数(通常为2的幂).大多数编译器还允许您更改对齐设置(使用#pragma). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |