怎么创建c语言数组的格式,c – 如何创建类类型数组?
您不能使用类数组,但可以使用指向函数的指针数组.
typedef std::unique_ptr (*Creator)();
template
std::unique_ptr make() { return new T{}; }
Creator const array[] = { make, make, make };
int main() {
std::unique_ptr b = array[1]();
b->foo();
}
对于那些担心创建这么多模板函数的成本的人来说,这是一个例子:
#include
struct Base { virtual void foo() const = 0; };
struct A: Base { void foo() const { printf("A"); } };
struct B: Base { void foo() const { printf("B"); } };
struct C: Base { void foo() const { printf("C"); } };
typedef Base* (*Creator)();
template
static Base* make() { return new T{}; }
static Creator const array[] = { make, make, make };
Base* select_array(int i) {
return array[i]();
}
Base* select_switch(int i) {
switch(i) {
case 0: return make();
case 1: return make();
case 2: return make();
default: return 0;
}
}
LLVM / Clang生成以下输出:
define %struct.Base* @select_array(int)(i32 %i) uwtable {
%1 = sext i32 %i to i64
%2 = getelementptr inbounds [3 x %struct.Base* ()*]* @array, i64 0, i64 %1
%3 = load %struct.Base* ()** %2, align 8, !tbaa !0
%4 = tail call %struct.Base* %3()
ret %struct.Base* %4
}
define noalias %struct.Base* @select_switch(int)(i32 %i) uwtable {
switch i32 %i, label %13 [
i32 0, label %1
i32 1, label %5
i32 2, label %9
]
; :1 ; preds = %0
%2 = tail call noalias i8* @operator new(unsigned long)(i64 8)
%3 = bitcast i8* %2 to i32 (...)***
store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for A, i64 0, i64 2) to i32 (...)**), i32 (...)*** %3, align 8
%4 = bitcast i8* %2 to %struct.Base*
br label %13
; :5 ; preds = %0
%6 = tail call noalias i8* @operator new(unsigned long)(i64 8)
%7 = bitcast i8* %6 to i32 (...)***
store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for B, i64 0, i64 2) to i32 (...)**), i32 (...)*** %7, align 8
%8 = bitcast i8* %6 to %struct.Base*
br label %13
; :9 ; preds = %0
%10 = tail call noalias i8* @operator new(unsigned long)(i64 8)
%11 = bitcast i8* %10 to i32 (...)***
store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for C, i64 0, i64 2) to i32 (...)**), i32 (...)*** %11, align 8
%12 = bitcast i8* %10 to %struct.Base*
br label %13
; :13 ; preds = %9, %5, %1, %0
%.0 = phi %struct.Base* [ %12, %9 ], [ %8, %5 ], [ %4, %1 ], [ null, %0 ]
ret %struct.Base* %.0
}
不幸的是,它不够智能,无法使用常规数组代码自动内联函数(LLVM优化器的已知问题,我不知道gcc是否做得更好)……但是使用switch确实是可能的.
怎么创建c语言数组的格式,c – 如何创建类类型数组?相关推荐
- three.js使用外部模型创建动画,使用GLTF格式文件动画创建动画(vue中使用three.js71)
使用GLTF格式文件动画创建动画 1.demo效果 2. 实现要点 2.1 加载GLTF文件 2.2 创建AnimationMixer动画 2.3 render中更新动画 3. demo代码 1.de ...
- visual 创建c语言程序吗,visual studio怎么创建c语言
visual studio创建c语言程序的方法:首先打开VS主程序,选择创建新项目:然后在菜单栏中选择C++:接着进入VS主界面,在右边的解决方案管理器中找到源文件,右键添加,并选择新建项:最后选择添 ...
- java 类类型数组
今天做题,遇到了定义数组类型是类的,以前都是基本数据类型啊,今天看到这个懵了好久,不过最终还是搞懂了.最后做了一个练习题,一起来看一下吧 题目要求是: // 一个方阵,3排,第一排,从左往右依次是 小 ...
- 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)
原理介绍 我们利用万能指针来实现动态数组,数组元素类型可以是任意类型,因为我们只维护用户提供的数据的地址,所以可以用万能指针来接受,这样就实现了类似C++中的模板功能了. 先说说动态数组和静态数组.静 ...
- Java 数组定义格式-数组动态初始化-数组元素的访问-数组静态初始化-数组的遍历-数组获取最大值
数组定义格式: 1.数组概述 在一个班级中,有非常多学生需要存储每位学生的考试成绩. 比如 a=98; b=97; c=96; d=88; -- 1)数组概述:一次性声明大量的用于存储数据的变量; 这 ...
- Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)
原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...
- javascript 类型数组读取二进制数据
先建一个文件,按UTF-16大端 BOM 格式保存一个字符串:hi aleck, 使用 file API 把他按二进制方式读取到浏览器. 文件读取方法在这里: http://hi.baidu.com/ ...
- C语言第二课:项目的创建、基本结构与两个常见问题的处理
目录 一.创建新项目: 二.C语言程序基本结构: 1.头文件(#include<...>): 2.主函数(int main(){...}): 3.程序语句(语句项): 三.常见问题处理: ...
- php 1 2 3 转arry_在PHP语言中使用JSON和将json还原成数组的方法
在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_deco ...
最新文章
- linux启动关闭脚本,Linux下自动启动关闭Oracle脚本
- python爬虫,爬取猫眼电影2(xpath和bs4)
- Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】
- 10tb服务器硬盘 选购,2017最靠谱大容量机械硬盘选购指南(基于Backblaze硬盘寿命可靠性报告)...
- 南京理工大学计算机学院教授严捍,2019年7月1日学术报告二则(宋巍 教授,南京理工大学;张鹏程 副教授,河海大学)...
- 中国吉非替尼行业市场供需与战略研究报告
- CCF201812-1 小明上学(100分)【序列处理】
- Java logging整理
- MindManager思维导图 PRDBRD写作方法与技巧 产品规划模板下载
- Linux网络编程:libnet 移植及使用
- 如何购买阿里云域名教程(域名购买+配置)~
- 采购精英的行为准则(精典)
- win7没有语音识别怎么办|win7系统语音识别设置方法
- SpringCloud-狂神(1. 概述)学习笔记
- size与capacity的区别
- 关于 Kubernetes中kube-controller-managerr的一些笔记
- SpringCloud Alibaba 实战之《配置中心:基于 Nacos 集中管理应用配置》
- 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
- CS_2023_01
- vps系统服务器,vps系统和云服务器
热门文章
- 南海区行政审批管理系统接口规范v0.3(规划) 2.业务申报API 2.1.businessApply【业务申报】...
- python第六篇:Python复制超大文件、复制二进制文件
- C语言-07其它相关
- 代码动态改变 NGUI UILabel 的字体
- 如何在类的外部修改类中的私有数据成员
- C++_类和对象_C++多态_多态的原理剖析---C++语言工作笔记070
- axios_json-server的介绍与服务器搭建---axios工作笔记002
- 大数据之-hadoop知识体系架构---大数据之hadoop工作笔记0001
- 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025
- Netty工作笔记0080---编解码器和处理器链梳理