首页 > 系统相关 >std::optional 内存布局

std::optional 内存布局

时间:2023-07-26 16:14:46浏览次数:52  
标签:std last struct Optional bytes cacheline 内存 optional payload

对于std::optional<int>对应的内存布局为

struct optional_mem {
	int _M_payload;
	bool _M_engaged;
};

可以通过godbolt通过pahole工具查看
image
在汇编窗口选择 pahole右侧会显示数据结构

class exception_ptr {
	void *                     _M_exception_object;  /*     0     8 */
public:


	/* size: 8, cachelines: 1, members: 1 */
	/* last cacheline: 8 bytes */
};
struct nullopt_t {

	/* size: 1, cachelines: 0, members: 0 */
	/* padding: 1 */
	/* last cacheline: 1 bytes */
};
class optional<int> : _Optional_base<int, true, true>, _Enable_copy_move<true, true, true, true, std::optional<int> > {
	/* struct _Optional_base<int, true, true> <ancestor>; */ /*     0     8 */

	/* XXX 65528 bytes hole, try to pack */

	/* struct _Enable_copy_move<true, true, true, true, std::optional<int> > <ancestor>; */ /*     0     0 */

	/* XXX last struct has 1 byte of padding */
public:


	/* size: 8, cachelines: 1, members: 2 */
	/* padding: 8 */
	/* paddings: 1, sum paddings: 1 */
	/* last cacheline: 8 bytes */

	/* BRAIN FART ALERT! 8 bytes != 0 (member bytes) + 0 (member bits) + 65528 (byte holes) + 0 (bit holes), diff = -524224 bits */
};
class _Optional_base_impl<int, std::_Optional_base<int, true, true> > {
protected:


	/* size: 1, cachelines: 0, members: 0 */
	/* padding: 1 */
	/* last cacheline: 1 bytes */
};
struct _Empty_byte {

	/* size: 1, cachelines: 0, members: 0 */
	/* padding: 1 */
	/* last cacheline: 1 bytes */
};
union _Storage<int, true> {
	struct _Empty_byte         _M_empty;           /*     0     0 */
	int                        _M_value;           /*     0     4 */
};
struct _Optional_payload_base<int> {
	union _Storage<int, true>  _M_payload;           /*     0     4 */
	bool                       _M_engaged;           /*     4     1 */

	/* size: 8, cachelines: 1, members: 2 */
	/* padding: 3 */
	/* last cacheline: 8 bytes */
};
struct _Optional_payload<int, true, true, true> : _Optional_payload_base<int> {
	/* struct _Optional_payload_base<int> <ancestor>; */ /*     0     8 */

	/* XXX last struct has 3 bytes of padding */

	/* size: 8, cachelines: 1, members: 1 */
	/* paddings: 1, sum paddings: 3 */
	/* last cacheline: 8 bytes */

	/* BRAIN FART ALERT! 8 bytes != 0 (member bytes) + 0 (member bits) + 0 (byte holes) + 0 (bit holes), diff = 64 bits */
};
struct _Optional_base<int, true, true> : _Optional_base_impl<int, std::_Optional_base<int, true, true> > {
	/* class _Optional_base_impl<int, std::_Optional_base<int, true, true> > <ancestor>; */ /*     0     0 */

	/* XXX last struct has 1 byte of padding */

	struct _Optional_payload<int, true, true, true> _M_payload; /*     0     8 */

	/* size: 8, cachelines: 1, members: 2 */
	/* paddings: 1, sum paddings: 1 */
	/* last cacheline: 8 bytes */
};
struct _Enable_copy_move<true, true, true, true, std::optional<int> > {

	/* size: 1, cachelines: 0, members: 0 */
	/* padding: 1 */
	/* last cacheline: 1 bytes */
};
class bad_optional_access : public exception {
public:

	/* class exception           <ancestor>; */      /*     0     0 */

	/* size: 8, cachelines: 1, members: 1 */
	/* padding: 8 */
	/* last cacheline: 8 bytes */
};

可以看到最终数据存储在

struct _Optional_payload_base<int> {
	union _Storage<int, true>  _M_payload;           /*     0     4 */
	bool                       _M_engaged;           /*     4     1 */

	/* size: 8, cachelines: 1, members: 2 */
	/* padding: 3 */
	/* last cacheline: 8 bytes */
};

中,_M_payload中存储实际数据

标签:std,last,struct,Optional,bytes,cacheline,内存,optional,payload
From: https://www.cnblogs.com/gbcwbz/p/17582673.html

相关文章

  • 什么是PHP共享内存,用实例给你们解释一下
    什么是共享内存共享内存是一种在同一台机器的不同进程(应用程序)之间交换数据的方式。一个进程可创建一个可供其他进程访问的内存段,并赋予它相应的权限。每个内存段拥有一个惟一的ID,我们通常称之为shmid,这个ID指向一个物理内存区域,其他进程可通过此ID来操作这块内存,包扩读取、写......
  • redis 内存是否满了 怎么看
    Redis内存是否满了怎么看在使用Redis时,我们经常会面临一个问题,就是如何判断Redis的内存是否已经满了。因为Redis是基于内存的数据库,当内存不足时,可能会导致系统变慢甚至崩溃。因此及时监控Redis的内存使用情况非常重要。如何监控Redis的内存使用情况Redis提供了一些命令和配置选......
  • 为什么 CPU 访问寄存器的速度比访问内存的速度快
    为什么CPU访问寄存器的速度比访问内存的速度快寄存器是位于CPU内部的高速存储器件,而内存则是位于CPU外部的存储器件。在计算机体系结构中,访问速度极大取决于数据存储设备与CPU之间的距离,当CPU需要从存储设备中读取数据时,必须通过一系列的总线、控制器等中间设备进行数......
  • (五) MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图
    (五)MdbCluster分布式内存数据库——数据迁移架构及节点扩缩容状态图 上一篇:(四)MdbCluster分布式内存数据库——业务消息处理本节主要讨论在系统扩容期间的数据迁移架构及节点的状态图。我们将通过介绍这两部分,慢慢展开复杂的扩缩容流程。下图从左到右,我们增......
  • 链表的头插法(代码+内存图)
    头插法代码示例publicclassLinkDemo{publicstaticvoidmain(String[]args){//将这个数组按头插的方式插入列表int[]arr={1,2,3,4,5,6,7,8,9};headIndert(arr);}publicstaticvoidheadIndert(int[]arr){Nodeli......
  • 内存对齐
    一.内存对齐内存对齐的好处某些情况下,可能需要多次访存,比如64位CPU,每次最多可获取8B,现在有一个8B长的变量,如果没有对齐,可能前6B存在前一个地址,后2B存在另一个地址,两次才能取出,如果对齐,那就只需要访存一次可能会破坏访存的原子性,常见的就是longlong并发时的错误某些ARM......
  • Artistdirect.com为Zune播放器提供的热门歌曲MP3
    Artistdirect.com为Zune播放器提供的热门歌曲MP3http://assets.artistdirect.com/Downloads/artd/listen/Smile.mp3http://assets.artistdirect.com/Downloads/artd/listen/cracker-low.mp3http://assets.artistdirect.com/Downloads/artd/listen/DDTS.mp3http://assets.artistdire......
  • java多线程内存图
    多线程的例子例一:publicclassTest{publicstaticvoidmain(String[]args)throwsException{Threadx1=newThread(){@Overridepublicvoidrun(){for(inti=0;i<100;i++){Syst......
  • GE反射内存卡的指标和型号
    产品特性:•1路发送,1路接收;•光纤高速网络2.12GHz;•最大256个节点;•光纤协议不占用CPU资源;•多模光纤节点距离300米;单模光纤节点距离10千米;•板载128M/256MByteSDRAM;•低延迟率(n秒级);•动态包长:每个包4到64或1M个字节。产品选型:1、CPCI接口-5565PIORC-110000(128MSDRAM多......
  • std::bind 详解
    bindbind是C++的一个函数,用来绑定其他函数,用来改造。1.普通函数的bind普通函数可以被绑定,传参。intadd(intx,inty){cout<<"intadd(int,int)"<<endl;returnx+y;}以上有一个add普通函数,则,bind绑定。#include<functional>usingstd::bind;i......