怎么创建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 ...
最新文章
- 一次DPM备份Exchange DAG的故障处理过程
- 倒计时两天丨NeurIPS 2020预讲会:7位智源青年科学家,21场报告
- 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
- 信息系统项目管理师优秀论文:论信息系统范围管理
- vpn mysql_MYSQL数据库
- 解决iSlider的一些问题(滑动组件)
- 不懂网络和懂一点的区别
- [转载] python中pprint模块详解——print()和pprint()两者的区别
- Atitit oil painting article list sumup s55 C:\Users\Administrator\Desktop\油画技术资料包\Atitit Atitit 图像
- NSGA2算法中拥挤度计算代码
- Android PreferenceScreen
- 最新HyperSnap绿色汉化版
- 洛雪音乐助手(五音版)
- php实现给excel(xlsx)文件添加背景图水印
- 清卡时提示“增值税未申报或未比对”
- 重新编译Spark2.4.0 Parcels包
- Python django 社团管理系统
- 苹果电脑mp3转gif_Mac视频怎样转换成Gif图片?
- 白杨英语-字母含义笔记
- 哪来的gou zi 阿龙(最新更新于1.21日)
热门文章
- C语言入门篇(二)指针的介绍和运用
- 【第五周课后作业】“番茄工作法”软件创新性分析
- 【WPF】TextBox样式重写注意事项
- synchronized与lock,哪个效率更高
- 支持XML和JSON数据的图表控件FusionCharts XT
- Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
- SAAS多租户实现方案_springboot 实现多租户_基于共享数据库_共享schema_共享数据表_基于baomidou_mybatis_plus---springcloud工作笔记158
- fckeditor异常总结---java.lang.ClassNotFoundException: org.devlib.schmidt.imageinfo.ImageInfo
- 计算机英语中motherboard,计算机英语--Motherboard.doc
- mysql utf-8_完美解决mysql下utf-8的乱码问题