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

如何处理[[no_unique_address]]是实现定义的吗?

夹谷辰沛
2023-03-14

以下摘自cppref,但简化为演示:

#include <iostream>
 
struct Empty {}; // empty class

struct W
{
    char c[2];
    [[no_unique_address]] Empty e1, e2;
};
 
int main()
{ 
    std::cout << std::boolalpha;

    // e1 and e2 cannot have the same address, but one of them can share with
    // c[0] and the other with c[1]
    std::cout << "sizeof(W) == 2 is " << (sizeof(W) == 2) << '\n';
}

文档显示输出可能是:

sizeof(W) == 2为真

但是,gcc 和叮当声输出如下所示:

sizeof(W) == 2为假

实现是否定义了如何处理[[no_unique_address]]

共有2个答案

解阳泽
2023-03-14

是的,实际上no_unique_address的所有方面都是实现定义的。它是一种允许优化而不是强制优化的工具。

话虽如此,当您尝试拥有两个具有相同类型的子对象时,您永远不应该假设no_unique_address会起作用。标准仍然要求相同类型的所有不同子对象都有不同的地址,不管是不是no_unique_address。尽管编译器可以通过彻底重新排序成员来为这些空子对象分配不同的地址…他们几乎不会这样做。

要合理利用no_unique_address优化,最好的办法是永远不要有两个相同类型的子对象,并尝试将所有可能为空的成员放在第一位。也就是说,您应该期望实现将一个空的no_unique_address成员分配给下一个成员的偏移量(或整个包含结构的偏移量)。

琴琪
2023-03-14

请参见[intro.object]/8:

如果…否则,如果对象是标准布局类类型的基类子对象,没有非静态数据成员,则该对象的大小为零。否则,对象的大小为零的情况是实现定义的。

在C 11中,空基类优化成为标准布局类的强制性要求(参见这里的讨论)。空成员优化从来都不是强制性的。正如您所怀疑的,它是由实现定义的。

 类似资料:
  • 本文向大家介绍Springboot之自定义全局异常处理的实现,包括了Springboot之自定义全局异常处理的实现的使用技巧和注意事项,需要的朋友参考一下 前言: 在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致的异常,我们一般有两种处理方式,一种是throws直接抛出,一种是使用try.

  • 我需要实现我的自定义DefaultComboxModel。这样做的原因是每次我打电话给 或者 或者 我看到它自动触发一个项目状态更改事件。这会导致一些随机项目自动从列表中选择。这不是我想要的,因为它用随机选择的项目填充可编辑的JTextField。 这是我在使用我的自定义Itemlistener中的Thread.dumpStack()进行调试时看到的stacktrace,它是我在调用上述方法时看到

  • 本文向大家介绍hadoop的TextInputFormat作用是什么,如何自定义实现?相关面试题,主要包含被问及hadoop的TextInputFormat作用是什么,如何自定义实现?时的应答技巧和注意事项,需要的朋友参考一下 InputFormat会在map操作之前对数据进行两方面的预处理。 1是getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一

  • 本文向大家介绍hadoop的TextInputFormat作用是什么,如何自定义实现相关面试题,主要包含被问及hadoop的TextInputFormat作用是什么,如何自定义实现时的应答技巧和注意事项,需要的朋友参考一下 InputFormat会在map操作之前对数据进行两方面的预处理 1是getSplits,返回的是InputSplit数组,对数据进行split分片,每片交给map操作一次 2

  • 我正在使用Spring开发一个应用程序。在Access Control Access一节中,我想使用Spring Security Acl(我是Acl的新手)。我想在我的应用程序中实现ACL基于两点: 应用程序应该具有以下五种权限:、、、和。 权限是分层的,当用户具有权限时,它应该能够,或者当用户具有权限时,它应该能够、和等。 更新: 我的应用程序是基于Spring MVC RESTful的。当用

  • 本文向大家介绍SpringBoot 错误处理机制与自定义错误处理实现详解,包括了SpringBoot 错误处理机制与自定义错误处理实现详解的使用技巧和注意事项,需要的朋友参考一下 【1】SpringBoot的默认错误处理 ① 浏览器访问 请求头如下: ② 使用“PostMan”访问 请求头如下: 总结:如果是浏览器访问,则SpringBoot默认返回错误页面;如果是其他客户端访问,则默认返回JSO