当前位置: 首页 > 知识库问答 >
问题:

空基类优化现在是强制性优化吗(至少对于标准布局类)?

施阳曜
2023-03-14

根据C 11 9.1/7(草案n3376),标准布局类是这样一个类:

>

  • 没有类型为非标准布局类(或此类类型的数组)或引用的非静态数据成员,

    没有虚函数(10.3)和虚拟基类(10.1),

    对所有非静态数据成员具有相同的访问控制(第11条),

    没有非标准布局的基类,

    在大多数派生类中没有非静态数据成员,并且最多有一个基类具有非静态数据元素,或者没有基类具有静态数据元素;以及

    没有与第一个非静态数据成员类型相同的基类。

    因此,一个空类是一个标准布局类;另一个以空类为基的类也是一个标准布局类,前提是该类的第一个非静态数据成员与基不属于同一类型。

    此外,9.2/19指出:

    指向标准布局结构对象的指针,使用reinterpret_cast进行适当转换,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。[注意:因此标准布局结构对象中可能有未命名的填充,但不是在其开头,这是实现适当对齐所必需的。-结束注释]

    这似乎暗示空基类优化现在是强制性优化,至少对于标准布局类来说是这样。我的观点是,如果空基优化不是强制性的,那么标准布局类的布局就不是标准的,而是取决于实现是否实现了所说的优化。我的推理是正确的,还是我错过了什么?

  • 共有1个答案

    阎辰钊
    2023-03-14

    是的,你是对的,这在“重新审视POD”的提案中已经指出:http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2007/n2342.htm#ABI

    Embarcadero编译器文档也声明:http://docwiki.embarcadero.com/RADStudio/en/Is_standard_layout

    另一个关键点是[class.mem]/16

    如果两个标准布局结构(第 9 条)类型具有相同数量的非静态数据成员,并且相应的非静态数据成员(按声明顺序)具有布局兼容类型 (3.9),则它们与布局兼容。

    请注意,只有数据成员影响布局兼容性,而不影响基类,因此这两个标准布局类是布局兼容的:

    struct empty { };
    struct stdlayout1 : empty { int i; };
    
    struct stdlayout2 { int j; };
    
     类似资料:
    • 本文向大家介绍Android中使用ViewStub实现布局优化,包括了Android中使用ViewStub实现布局优化的使用技巧和注意事项,需要的朋友参考一下 在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介绍一个在某些场景下提升布局性能的View,它就是ViewStub. ViewStub是什么 View

    • 本文向大家介绍Android布局优化之ViewStub控件,包括了Android布局优化之ViewStub控件的使用技巧和注意事项,需要的朋友参考一下 ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View。虽然Android开发人员基本上都听说过,但是真正用的可能不多。 ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法

    • 我试图通过扁平化视图层次结构来优化Android应用程序中的布局。这里有一个特别难的问题! 此布局有一个主线布局,用于容纳顶行和底行(它们本身就是水平的子线布局)。中间的四个项目中的每一个都是使用LayOut权重来展开的垂直相对性(以适应图像视图和文本视图)。包含两个项目的每一行也是一个水平线性布局。 不用说,这种布局效率非常低,在绘制时会导致许多“编排者跳过了帧”的消息。我想删除这些嵌套的布局,

    • 有许多因素影响你的 Web 应用程序的性能。有些是环境, 有些是你的代码,而其他一些与 Yii 本身有关。 在本节中,我们将列举这些因素并解释如何通过调整这些因素来提高应用程序的性能。 优化你的 PHP 环境 一个好的 PHP 环境是非常重要的。为了得到最大的性能, 使用最新稳定版本的 PHP。 PHP 的主要版本可能带来显著的性能提升。 启用字节码缓存 Opcache(PHP 5.5或更高版本)

    • 使用 YOG2 我们可以轻松的实现多种性能优化功能。 压缩 yog2 release --dest dev --optimize # 也可以使用等价缩写 yog2 release -od dev 压缩功能将会对 JavaScript, CSS, PNG 三种资源进行压缩。 MD5戳 在使用 fis 管理了静态资源后,我们可以通过开启 MD5 戳来实现静态资源的强缓存,关于 MD5戳的优点,可

    • 页面性能优化 桌面端性能优化 网络加载 减少 HTTP 请求次数; 减小 HTTP 请求大小; 将 CSS 或 JavaScript 放到外部文件中,避免使用标签直接引入; 避免页面中空的 href 和 src 属性; 为 HTML 指定 Cache-Control 或 Expires; 合理设置 Etag 和 Last-Modified; 减少页面重定向; 使用静态资源分域存放来增加下载并行数;