C++ 模板函数、模板类:如果没有被使用就不会被实例化

2023-10-30

C++中如果一个模板函数没有使用过,那么其局部静态变量都不会被实例化:

class A {
public:
    A() {
        edward::print("A ctor");
    }
};

template<typename T>
void test() {
    static A a;
}

int main() {
    test<int>();	//如果注释掉则不会有输出
    return 0;
}

A ctor

如果不显示地调用test函数,局部静态变量a是不会被实例化的。

同样的,如果一个静态类没有被实例化,那么他的成员也不会被实例化,就算这个静态类实例化了,但是没有使用一些静态变量、方法,那么这些没有使用的东西是不会被实例化的。注意:成员变量在模板类实例化后无论是否使用都存在。

class A {
public:
    A() {
        edward::print("A ctor");
    }
};

template<typename T>
class Test {
public:
    static A a;
    A aa;
};

template<typename T>
A Test<T>::a;

int main() {
    Test<int> test;
//    test.a;	//如果取消注释会多打印一条语句	
    return 0;
}

A ctor

通过观察注释的语句,我们发现模板类的静态变量a如果没有被使用,那么即使模板类实例化也不存在(具体来说就是不分配内存,不调用构造函数)。
至于静态方法和成员方法更是如此了,在《C++ Primer》第五版 16.1.2 类模板-类模板成员函数的实例化这部分提到:如果一个成员函数没有被使用,那么它不会被实例化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 模板函数、模板类:如果没有被使用就不会被实例化 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 不要声明只读可变引用类型 - 为什么不呢?

    我一直在阅读这个问题 https stackoverflow com questions 2274412 immutable readonly reference types fxcop violation do not declare r
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • MySQL 8.0.23中复制架构从节点自动故障转移

    接触MGR有一段时间了 MySQL 8 0 23的到来 基于MySQL Group Replicaion MGR 的高可用架构又提供了新的架构思路 灾备机房的slave 如何更好的支持主机房的MGR MGR 到底可以坏几个节点 这次我就以上
  • fastgithub

    之前我在网上搜过解决办法 其中一个是修改 hosts 文件 但是效果不太理想 我在这里给大家推荐github上的一个开源项目 FastGithub 用了这个之后 效果就比较理想了 次次都能访问到 源码地址 GitHub dotnetcore
  • 简易虚拟培训系统-UI控件的应用2

    目录 Text组件 文字显示 Text组件 文字动态显示 ScrollView组件 使用文件流动态读取硬盘文件 本篇介绍Text和ScrollView的简单应用 以及读取硬盘中 txt文本的内容 Text组件 文字显示 1 加入Text 在
  • 小程序导入npm包 注意事项

    官方api https developers weixin qq com miniprogram dev devtools npm html 1 需要在小程序文件夹 npm init 2 安装需要的npm包 先安装需要的npm 包在构建np
  • 解释器与编译器区别

    让我们看看编译器和解释器之间的主要区别 1 编译器将一个程序作为一个整体进行翻译 而解释器则一条一条地翻译一个程序 2 在编译器的情况下生成中间代码或目标代码 而解释器不创建中间代码 3 编译器比解释器要快得多 因为编译器一次完成整个程序
  • Java基础面试题附带答案(八)

    106字节流和字符流的区别 1 字节流读取的时候 读到一个字节就返回一个字节 字符流读取的时候会读到一个或多个字节 这个要根据字符流中编码设置 一般中文对应的字节数是两个 在UTF 8码表中是3个字节 2 字节流可以处理所有类型数据 如 图
  • Unity如何开发微信小游戏

    微信小游戏现在非常的火 很多开发Unity的同学 都想自己开发微信小游戏 无奈tiny还不成熟 导致很多同学有自己创业做微信小游戏的想法 但是由于技术 却放弃了这样的机会 今天我给大家讲述unity同学如何转型做微信小游戏 1 解放思想 我
  • angular使用websocket和Rxjs

    文章目录 前言 一 Websocket是什么 二 在服务端搭建websocket服务 三 使用rxjs中的websocketsubject 1 使用websocket 2 搭建服务 3 如何拦截到socket关闭 4 如何断线重连 5 如何
  • 运行时动态库:not found 及介绍-linux的-Wl,-rpath命令

    一 运行时动态库 not found 今天在使用linux编写c c 程序时 需要用到第三方的动态库文件 刚开始编译完后 运行提示找不到动态库文件 我就使用了ldd命令查看了一下 发现是有一个库文件显示 not found 如下图所示 库文
  • 法兰克焊接机器人编程入门_Fanuc焊接机器人编程实例

    L 11 89 IF R 2 2 JMP LBL 12 90 IF R 2 3 JMP LBL 13 91 IF R 2 4 JMP LBL 14 92 IF R 2 5 JMP LBL 15 93 IF R 2 6 JMP LBL 16
  • CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.To initi

    看起来你的shell没有正确配置使用conda activate命令 这可能是因为你在安装Anaconda时没有选择将其添加到系统路径中 解决这个问题的方法是运行conda init
  • Power BI第三方图表

    KPI类 Bullet Chart 子弹图 用来展现目标完成率 可定义红 黄 绿区域 Bullet Chart by OKViz 以垂直或水平形式展现目标达成情况 同时可以显示多个指标 Card with States by OKViz 一
  • 钉钉开放平台查询宜搭表单实例数据

    本例结合钉钉开放平台相关api实现获取宜搭表单数据 可在faas中做实现 本例采用python编写 已在本地实现 对于免登获取数据 数据归档到本地能提供参考 faas具体实现请根据实际 参考使用 采用alibabacloud dingtal
  • 【16种重要流操作】

    文章目录 前言 一 16种重要流是什么 二 输入输出流模型化 1 输入流操作 2 输出流操作 三 16种输入输出流 代码通 总结 前言 输入输出流的使用已经非常的广泛 除过采用了不同的类操作 其方法大同小异 下文针对16种重要的流进行分解
  • openEuler-22.03-LTS 安装与配置笔记

    镜像下载与安装 openEuler下载页 镜像下载 下载镜像 wget c https repo openeuler org openEuler 22 03 LTS ISO x86 64 openEuler 22 03 LTS x86 64
  • Recall, Precision, AP, mAP的计算方法(看一次就懂系列)

    Recall Precision AP mAP的计算方法 看一次就懂系列 mAP全称是mean Average Precision 这里的Average Precision 是在不同recall下计算得到的 所以要知道什么是mAP 要先了解
  • Vue的动画和过渡效果详解

    产品中优雅的交互动画可以吸引更多用户留存使用 对于前端的动画实现要求也越来越高了 在Vue中提供了一些快捷 方便的标签和内置属性来更加优雅的实现动画和过渡效果 今天我们来一起学习一下 基础动画效果 公众号 Code程序人生 个人网站 htt
  • 视频生成: 基于Stable Diffusion的微调方法

    chatGPT带来了几个月的AIGC热度 文本图像生成模型大行其道 但AI在视频生成任务上尚没有较好的开源仓库 并受限于 缺那么几百块A100 的资源问题 大多数人无法展开视频生成的研究 好在目前有不少针对视频生成的相关paper 也有不少
  • python在with open()函数中,如何在文件名设置中引用变量

    用format 函数 name wz age 25 with open C Users 0 1 txt format name age w encoding utf 8 as f1 f1 write hellow world 则文件名为 w
  • C++ 模板函数、模板类:如果没有被使用就不会被实例化

    C 中如果一个模板函数没有使用过 那么其局部静态变量都不会被实例化 class A public A edward print A ctor template