C++ 抑制自动初始化和销毁

2023-12-10

如何抑制类型的自动初始化和销毁​​?虽然这很美妙T buffer[100]自动初始化所​​有元素buffer,并在它们超出范围时销毁它们,这不是我想要的行为。

#include <iostream>

static int created   = 0,
           destroyed = 0;

struct S
{
    S()
    {
        ++created;
    }
    ~S()
    {
        ++destroyed;
    }
};

template <typename T, size_t KCount>
class fixed_vector
{
private:
    T m_buffer[KCount];
public:
    fixed_vector()
    {
        // some way to suppress the automatic initialization of m_buffer
    }

    ~fixed_vector()
    {
        // some way to suppress the automatic destruction of m_buffer
    }
};

int main()
{
    {
        fixed_vector<S, 100> arr;
    }

    std::cout << "Created:\t"   << created   << std::endl;
    std::cout << "Destroyed:\t" << destroyed << std::endl;
    return 0;
}

该程序的输出是:

Created:    100
Destroyed:  100

我希望它是:

Created:    0
Destroyed:  0

我唯一的想法就是让m_buffer一些简单构造和破坏的类型,例如char然后依靠operator[]为我包装指针数学,尽管这似乎是一个可怕的黑客解决方案。另一种解决方案是使用malloc and free,但这给出了我不想要的间接程度。


我想要这个的原因是因为我正在制作一个容器,并且我不想为我不会使用的东西支付初始化开销。例如,如果我的main功能是:

int main()
{
    {
        std::vector<S> vec;
        vec.reserve(50);
    }

    std::cout << "Created:\t"   << created   << std::endl;
    std::cout << "Destroyed:\t" << destroyed << std::endl;
    return 0;
}

输出将是正确的:

Created:    0
Destroyed:  0

您可能想了解一下boost::optional

template <typename> struct tovoid { typedef void type; };

template <typename T, size_t KCount, typename = void>
struct ArrayStorage {
  typedef T type;
  static T &get(T &t) { return t; }
};

template <typename T, size_t KCount>
struct ArrayStorage<T, KCount, typename tovoid<int T::*>::type> {
  typedef boost::optional<T> type;
  static T &get(boost::optional<T> &t) {
    if(!t) t = boost::in_place();
    return *t;
  }
};

template <typename T, size_t KCount>
class Array
{
public:
    T &operator[](std::ptrdiff_t i) {
      return ArrayStorage<T, KCount>::get(m_buffer_[i]);
    }

    T const &operator[](std::ptrdiff_t i) const {
      return ArrayStorage<T, KCount>::get(m_buffer_[i]);
    }

    mutable typename ArrayStorage<T, KCount>::type m_buffer_[KCount];
};

对类类型进行了专门化,将它们包装成optional,从而延迟调用构造函数/析构函数。对于非类类型,我们不需要这种包装。不包裹它们意味着我们可以治疗&a[0]作为连续的内存区域,并将该地址传递给需要数组的 C 函数。boost::in_place将就地创建类类型,而不使用临时的T或其复制构造函数。

不使用继承或私有成员允许类保持聚合,从而允许方便的初始化形式

// only two strings are constructed
Array<std::string, 10> array = { a, b };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 抑制自动初始化和销毁 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 如何自动为 Swift 类创建初始化程序?

    UPDATE 使用结构而不是类 struct 在很多方面都更好 它有自己的初始化器 这是我的模型课 是否有可能创建init自动方法 每次我都必须将所有变量一一初始化 这会花费很多时间 class Profile var id String
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向

随机推荐

  • 是否可以通过向 .dex 添加额外的类并使用修改后的 manifest.xml 重新打包来修改 .apk?

    是否可以通过向 dex 添加额外的类并使用修改后的 manifest xml 重新打包来修改 apk 我知道有一些工具 例如baksmali smali 可以从 apk中反汇编 重新组装给定的classes dex 但不确定从那里可以修改什
  • 如何在 App Engine 上使用 go-sql-driver/mysql 连接到 Google Cloud SQL?

    我正在使用go sql 驱动程序 mysqlGo on App Engine 中的驱动程序用于连接到 Cloud SQL 实例 如下所示 import database sql github com go sql driver mysql
  • 两个子进程之间的管道

    我想在两个子进程之间实现管道来执行类似的事情env grep USER 这是我已经拥有但不起作用的 let mut child1 Command new cmd1 args args1 stdout Stdio piped spawn un
  • Unix SSH 无密码

    嘿 我对 Unix 完全陌生 我需要编写一个 shell 脚本 来连接到另一个终端并运行一些 SQL 查询 我到底该怎么做 我一直在浏览这个论坛和其他论坛的一些答案 如果我找到了我的答案 我不明白它 我可以手动连接 输入密码等 但我需要自动
  • 递归地反向链接列表

    我在链表中 定义了一个节点 typedef struct abc int id struct abc next node 我想递归地反转链表 我将头指针传递给函数 我的函数定义如下 node reverseLinkedListRecursi
  • 使用 telnet 从一个 Android 模拟器拨打另一个 Android 模拟器的电话?

    是否可以通过 telnet 从一个 Android 模拟器拨打另一个 Android 模拟器 例如 我在屏幕上打开了两个模拟器 5554 和 5556 我可以使用命令 gsm call 5554通过 telnet 接听来自 5554 的来电
  • 如何在 C# 中无需更多实例即可实现登录表单和主表单

    我在单击登录按钮时创建主表单的实例 并在单击注销按钮时再次创建登录表单的实例 我的代码是 if txtUsrNm Text Admin txtPswd Text Admin mainForm mainFm new mainForm main
  • 如何在文本下显示图像作为背景?

    我想在文本下显示图像 我用 Photoshop 完成了这个 但它是一个图像 所以每次文本更改时我都必须在 Photoshop 中进行更改 我想使用 jQuery 或 CSS3 或任何其他网络技术来实现相同的目标 我想要与此类似 但不是每次文
  • python argparse 可选参数的默认值

    usage h foo FOO bar 如何确保 FOO 的默认值是abc如果我像下面一样执行我的脚本 myscript py foo bar gt bar这里是位置参数 但args foo正在考虑bar作为论点 foo 我想args fo
  • 使用一种上下文更新一个实体,并使用另一种上下文插入新实体?

    问候并感谢您阅读我的帖子 我正在使用中更新条目 照片 using context new PhotoEntities context Entry photo State EntityState Modified 问题是当我使用保存此条目时
  • 如何让 ggplot ecdf 绘制填充背景

    我试图让我的经验累积密度曲线填充它们的背景 但似乎无法实现 我尝试了以下两种方法 第一种方法似乎改变了曲线的 alpha 而不是填充 ggplot myDataFrame aes x myVariable fill myFactor geo
  • Dreamweaver CS5.5 中的 Phonegap

    版本是什么Phonegap被使用过Dreamweaver CS5 5 我尝试过替换默认的phonegap js最新版本的文件给出了错误 更换现有的是个好主意吗phonegap js最新版本的文件 升级adobe dreamweaver cs
  • Mongo 查找数组包含给定数组的 x 值的文档

    我有一个收藏 其中有类似的文件 实体字段并不是在每个文档中都设置的 并且具有不同的值 id ObjectId 5388cfbdec82ba7cd5438635 name Name1 entity Entity1 Entity2 Entity
  • Flask-sqlalchemy 中多对多多...关系的多辅助表

    许多问题都是关于多对多的问题 可以使用辅助表来解决 但是多 多 多怎么样 如果存在一种更优雅的方法来处理这个问题 我试图提出一个问题https github com pallets flask sqlalchemy issues 710 但
  • Python 多个 telnet 会话

    我需要构建一个脚本来获取尽可能多的主机的 telnet 输出 并将它们保存到每个主机的单独文件中 该脚本应作为守护进程运行 目前我有一个函数封装了为单个主机执行此操作的逻辑telnetlib 但我不知道如何进行 我计划打开一个进程 mult
  • Symfony2+Doctrine:如何将 iso8859-1 转换为 utf-8,反之亦然?

    我们正在构建一个使用 Oracle 数据库的 Symfony2 应用程序 DB中的所有数据编码为WE8ISO8859P15 iso 8859 1 所有网站编码为utf 8 有没有办法将从数据库接收到的所有数据转换为utf8 并将发送到数据库
  • GNU Radio:使用声音输出作为输入源

    In gnuradio 伴侣我使用音频源块作为下一个块的输入信号 一切工作几乎都很好 唯一的小问题是我从麦克风收到信号 这是正常行为 我宁愿直接播放音频信号 而不必通过我的扬声器 我房间的空气和麦克风 所有这些都会产生信号损失并增加噪声 我
  • 如何填充 MVC4 剃刀视图的下拉列表 (C#)

    用户档案模型 Table Users public class UserProfiles Key DatabaseGeneratedAttribute DatabaseGeneratedOption Identity public int
  • 使用 pyodbc 将 Python 连接到 mac 中的 Teradata

    我成功安装了 python 2 7 的 pyodbc 模块 但是 当输入以下代码连接到teradata时 import pyodbc conn pyodbc connect DRIVER Teradata DBCNAME
  • C++ 抑制自动初始化和销毁

    如何抑制类型的自动初始化和销毁 虽然这很美妙T buffer 100 自动初始化所 有元素buffer 并在它们超出范围时销毁它们 这不是我想要的行为 include