【问题标题】:Do tuple implementations have an optimized layout?元组实现是否具有优化的布局?
【发布时间】:2023-03-10 02:46:01
【问题描述】:

在阅读this 时,我很惊讶元编程可以为您的班级布局做些什么。我必须承认,我没有完全掌握建议的最佳布局,如果我必须说明我的理解,那就是:

按降序排列类成员,即具有最大alignof 结果的类型排在第一位等

如果我弄错了,请随时纠正我(如果您对为什么会发生这种情况有一个简短的解释,那就更好了,我无法在我的问题中复制粘贴大部分基本原理),但我的问题是关于另一个话题:

std::tuple 的任何库实现是否有这样的布局优化?

如果没有,是否有任何标准的代数数据类型可以这样做,除了编写这样的机器之外,还有其他方法可以为我的班级做到这一点吗?

【问题讨论】:

    标签: c++ c++11 tuples memory-alignment


    【解决方案1】:

    据我所知,没有库实现优化对齐布局。您可以使用这样的程序来检查 tuple 布局:

    #include <iostream>
    #include <tuple>
    
    struct empty {};
    
    int
    main()
    {
        using T = std::tuple<double, int, empty, short, long>;
        T t{};
        std::cout << &t << '\n';
        std::cout << &std::get<0>(t) << '\n';
        std::cout << &std::get<1>(t) << '\n';
        std::cout << &std::get<2>(t) << '\n';
        std::cout << &std::get<3>(t) << '\n';
        std::cout << &std::get<4>(t) << '\n';
        std::cout << &t+1 << '\n';
        std::cout << sizeof(T) << '\n';
    }
    

    libc++ 按声明顺序存储元素,并为空成员优化空间。空成员被分流到前面。示例输出:

    0x7fff5ccf39f8
    0x7fff5ccf39f8
    0x7fff5ccf3a00
    0x7fff5ccf39f8
    0x7fff5ccf3a04
    0x7fff5ccf3a08
    0x7fff5ccf3a10
    24
    

    libstdc++ 以与声明相反的顺序存储元素,并为空成员优化空间。空成员被分流到前面。示例输出:

    0x7ffe4fc5b2a0
    0x7ffe4fc5b2b0
    0x7ffe4fc5b2ac
    0x7ffe4fc5b2a0
    0x7ffe4fc5b2a8
    0x7ffe4fc5b2a0
    0x7ffe4fc5b2b8
    24
    

    VS-2015 以与声明相反的顺序存储元素,并且不会优化空成员的空间。示例输出:

    0306FEF4
    0306FF04
    0306FF00
    0306FEFC
    0306FEF8
    0306FEF4
    0306FF0C
    24
    

    在这个例子中,我们看到为空成员优化空间并没有买任何东西,因为它无论如何都适合填充区域。

    标准中没有任何工具可以自动执行减少填充的任务。

    【讨论】:

    • 您能否详细说明为什么按降序排列是最佳布局?
    • @LorahAttkins:这是一种经常有效的启发式方法。它假定类本身通常是最大对齐的,因此将您的最大对齐成员放在首位可以保证您的最大对齐成员之间没有填充字节。然后移动到你的下一个最大的对齐成员,同样的逻辑将成立。当成员用完时,通常会在后面添加一些填充,以将 sizeof(your_class) 舍入为类对齐的倍数。因此,有时按对齐排列的技巧会为您节省字节,有时则不会。它是工具箱中的好工具。
    • 我应该在上面的评论中添加:每种类型的 sizeof 都是该类型对齐的倍数。例如,不存在具有 16 字节对齐和 sizeof 15 或 17 的类型。它的 sizeof 将是 16、32 或 48 等。这意味着&amp;a &amp;a + 1 是对齐至少与 alignof(a) 一样大的指针。
    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多