当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 从硬件到语言,详解C++的内存对齐(memory alignment)

从硬件到语言,详解C++的内存对齐(memory alignment)

2018年06月04日  | 移动技术网IT编程  | 我要评论

goseas下载,农业银行惠农卡贷款,tf卡是什么卡

转载请保留以下声明
  作者:)。

我们也可以写一个简单的程序测试一下自己的CPU对未对齐内存访问的支持,以下是代码:

#include <iostream>
#include <chrono>

using namespace std;
using namespace std::chrono;

milliseconds test_duration(volatile int * ptr)  // 使用volatile指针防止编译器的优化
{
    auto start = steady_clock::now();
    for (unsigned i = 0; i < 100'000'000; ++i)
    {
        ++(*ptr);
    }
    auto end = steady_clock::now();
    return duration_cast<milliseconds>(end - start);
}

int main()
{
    int raw[2] = {0, 0};
    {
        int* ptr = raw;
        cout << "address of aligned pointer: " << (void*)ptr << endl;
        cout << "aligned access: " << test_duration(ptr).count() << "ms" << endl;
        *ptr = 0;
    }
    {
        int* ptr = (int*)(((char*)raw) + 1);
        cout << "address of unaligned pointer: " << (void*)ptr << endl;
        cout << "unaligned access: " << test_duration(ptr).count() << "ms" << endl;
        *ptr = 0;
    }
    cin.get();
    return 0;
}

我测试使用的电脑的CPU是Intel Core i7 2630QM,是intel 2代酷睿CPU,测试结果为:

address of aligned pointer: 000000668DEFFA78
aligned access: 282ms
address of unaligned pointer: 000000668DEFFA79
unaligned access: 285ms

可以看出对齐与未对齐的内存访问没有性能上的差别。

在C++中修改对齐要求

一般情况下,我们不需要自定义对齐要求,但也会有很特殊的情况下需要做调整。C++中,我们可以使用alignas关键字修改一个类型、或者一个变量的对齐要求。例如:

class MyObject
{
    char c;
    alignas(8) int i;
    short s;
};

这样的话,变量i的对齐要求由原本的4变成了8,结果就是,i的字节数偏移由4变成了8,s的字节数偏移由8变成了12,MyObject的对齐要求也变成了8,大小变成了16。

我们也可以对MyObject的定义使用alignas:

class alignas(16) MyObject
{
    char c;
    int i;
    short s;
};

还可以在alignas里面写某个类型。也可以使用多个alignas,结果就是使用最大的对齐要求。例如以下MyObject的对齐要求就是16:

class alignas(int) alignas(16) MyObject
{
    char c;
    int i;
    short s;
};

alignas有一个限制,那就是不能用alignas改小对齐要求。例如以下的代码会报错:

alignas(1) int i;

另外,C++中,有一个特殊的类型:max_align_t,所有不大于他的对齐量叫做基础对齐量(fundamental alignment),比这个对齐量大的叫做扩展对齐量(extended alignment )。C++标准规定,所有平台必须要支持基础对齐量,而对于扩展对齐量的支持要看各个平台。一般来说max_align_t的对齐量等于long double的对齐量。

C++关于内存对齐的支持还有很多功能,例如查询对齐量的alignof关键字,可以创建任意大小任意对齐要求的类型的aligned_storage模板,还有方便模板编程的alignment_of等等,在此就不细述了。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网