首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C ++的新操作是否保证地址返回的对齐?

C ++的新操作是否保证地址返回的对齐?
EN

Stack Overflow用户
提问于 2019-03-18 00:07:46
回答 2查看 0关注 0票数 0

大多数有经验的程序员都知道数据对齐对于程序的性能很重要。我看到一些程序员编写的程序分配比他们需要的更大的缓冲区大小,并使用对齐的指针作为开始。我想知道我应该在我的程序中这样做,我不知道是否有任何保证C ++的新操作返回的地址对齐。所以我写了一个小程序来测试

代码语言:javascript
复制
for(size_t i = 0; i < 100; ++i) {
    char *p = new char[123];
    if(reinterpret_cast<size_t>(p) % 4) {
        cout << "*";
        system("pause");
    }
    cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
    short *p = new short[123];
    if(reinterpret_cast<size_t>(p) % 4) {
        cout << "*";
        system("pause");
    }
    cout << reinterpret_cast<void *>(p) << endl;
}
for(size_t i = 0; i < 100; ++i) {
    float *p = new float[123];
    if(reinterpret_cast<size_t>(p) % 4) {
        cout << "*";
        system("pause");
    }
    cout << reinterpret_cast<void *>(p) << endl;
}
system("pause");

我使用的编译器是Visual C ++ Express 2008.似乎返回的新操作的所有地址都是对齐的。但我不确定。所以我的问题是:有保证吗?如果他们确实有保证,我不必调整自己,如果没有,我必须。

EN

回答 2

Stack Overflow用户

发布于 2019-03-18 08:58:26

顺便提一下,MS文档提到了一些关于malloc / new返回地址的信息,这些地址是16字节对齐的,但是从实验来看并非如此。我碰巧需要一个项目的16字节对齐(以加速具有增强指令集的内存副本),最后我使用编写自己的分配器...

票数 0
EN

Stack Overflow用户

发布于 2019-03-18 09:58:27

这是一个迟到的答案,但只是为了澄清Linux上的情况 - 在64位系统上,内存总是16字节对齐:

http://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html

由GNU系统中的malloc或realloc返回的块的地址始终是8的倍数(或64位系统上的16)。

new运营商调用malloc内部(见./gcc/libstdc++-v3/libsupc++/new_op.cc),因此适用于new为好。

执行malloc这是部分glibc基本上定义 MALLOC_ALIGNMENT2*sizeof(size_t)size_t是32位= 4字节的64位和8字节=上分别X86-32和x86-64系统,。

代码语言:javascript
复制
$ cat ./glibc-2.14/malloc/malloc.c:
...
#ifndef INTERNAL_SIZE_T
#define INTERNAL_SIZE_T size_t
#endif
...
#define SIZE_SZ                (sizeof(INTERNAL_SIZE_T))
...
#ifndef MALLOC_ALIGNMENT
#define MALLOC_ALIGNMENT       (2 * SIZE_SZ)
#endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档