标签: C#

c++在公司里一般是做什么的啊

不得不说c++应用其实还是很广泛的。。。但是也不得不承认想要找到一个c++工作不容易。。。。

不像其他语言如果写业务的话几天就能上手。。。

一般 公司 啊 里97 条回复 • 2021-09-02 16:08:37 +08:00
wangxn 1
wangxn 2 天前
看不同类型的公司吧。
后台服务:就是提供普通的 HTTP 服务(逻辑用 C++ 写),RPC
基础架构:存储,数据库,区块链
各种机器学习算法的工程化:TensorFlow
游戏:用虚幻引擎制作的游戏,或者各种自研引擎。可能会有各种脚本绑定
111qqz 2
111qqz 2 天前
做基础架构,做深度学习的训练推理框架
wangxn 3
wangxn 2 天前
不过 Go 和 Rust 这种原生编译型语言一直在侵蚀 C++ 的应用领域,当然现在看来 C++ 的地位还算稳固,后面如何发展没人知道。
wobuhuicode 4
wobuhuicode 2 天前
魔改一下 ffmpeg
zxCoder 5
zxCoder 2 天前
@wangxn
@111qqz

这样看起来 c++的岗位似乎大多都需要一定的特定领域的经验啊
nieyujiang 6
nieyujiang 2 天前 via iPhone
图形渲染引擎
wyx119911 7
wyx119911 2 天前
cgi
inhzus 8
inhzus 2 天前 via iPhone
补充:高性能网关,类似于 nginx ;客户端跨平台
opengps 9
opengps 2 天前
嵌入式硬件
ipwx 10
ipwx 2 天前
@zxCoder 这些经验算不得经验吧,学起来不就四五天
agagega 11
agagega 2 天前 via iPhone
C++有些地方挺强大的,好像很少有语言支持泛型参数不是类型的,C++的模版可以把矩阵的行列数,还有物理上的量纲都做成强类型。

Cpp20 有了 Concept 、模块和协程以后又舒服多了。就是可惜在标准库演化太慢,又没有一个比较好的一键式包管理机制。
ipwx 12
ipwx 2 天前
@agagega 第三方其实还行,linux 上 conan 我用的很舒服。
lcdtyph 13
lcdtyph 2 天前
做显卡驱动的,用户态驱动是用 C++写的
echo1937 14
echo1937 2 天前
@zxCoder #5 其实不能说“c++的岗位似乎大多都需要一定的特定领域的经验”,
而是 C/C++贴近硬件,需要很强的计算机体系结构的相关知识,
毕竟你搞个 web 前后端开发也需要 HTTP 的基础知识。
wengjin456123 15
wengjin456123 2 天前 via Android
通信相关 c++非常多
ttgo 16
ttgo 2 天前 via iPhone
机器人。
justou 17
justou 2 天前
在公司编程不都是为了解决特定领域的特定问题么?
codyfeng 18
codyfeng 2 天前 via Android
做低延迟交易系统
ospider 19
ospider 2 天前 ❤️ 4
一般是写 C++ 的
YongYuan 20
YongYuan 2 天前
搜索系统、推荐系统
secondwtq 21
secondwtq 2 天前
卖萌的呗
dangyuluo 22
dangyuluo 2 天前
@ospider 似乎很有道理
liuidetmks 23
liuidetmks 2 天前 via iPhone
我在怀疑 现在还有这么苛刻的高性能需求吗?
一般是历史原因选 cpp 吧 rust go 不行不行吗
cassyfar 24
cassyfar 2 天前
云计算很多服务都是用 cpp 。
adeweb 25
adeweb 2 天前
我在工作环境用过的场景:
1. WebAssembly
2. Node 原生模块
3. Qt 桌面应用
daysv 26
daysv 2 天前
基本上低延迟的交易系统都要是 C++
Rico 27
Rico 2 天前
ue 开发
Aresrun 28
Aresrun 2 天前
@ospider 听君一席话,如听一席话
cheng6563 29
cheng6563 2 天前
cpp 和 python 很像,只会语言本身的话基本找不到工作
p2pCoder 30
p2pCoder 2 天前
推广搜,机器学习框架,这块大厂的需求还是相当大的,不过也仅集中于大厂,而且也是卷的离谱
hu8245 31
hu8245 2 天前
所有实时性要求高,资源要求苛刻的地方,都有 C++的身影
echo1937 32
echo1937 2 天前
@liuidetmks #23 有,很多,只是国内相对没有那么多的岗位。比如 编译器、虚拟机、数据库、脚本 /图形引擎、浏览器、大型工业软件、大型数学工具箱、操作系统、机器学习框架、图形 /图像 /音频处理。

Go 的高性能侧重于“高并发”,C/C++的高性能侧重于“0 开销”,Rust 在 2010 年发布的时候,C++11 都要有了,Rust 前途无量但是生态需要时间。
zuosiruan 33
zuosiruan 2 天前
游戏公司 后端用 c++的比较多。
Eagleyes 34
Eagleyes 2 天前
火星车,
月球车
shijingshijing 35
shijingshijing 2 天前 ❤️ 1
@Eagleyes 那个是用的 C,火星车上用 C++做的图像识别相关的,限制非常严格,几乎等同于带类的 C,不能用多态,不能用递归,不能用动态内存分配。
GalaDOS 36
GalaDOS 2 天前
魔改 WebRTC,优化编码器,做视频通信或者直播软件,以及配套的媒体服务器
yuhaijiang2019 37
yuhaijiang2019 2 天前
*近正在自学 C++,和虚幻引擎
3dwelcome 38
3dwelcome 2 天前
我用 C++写 wasm 网页,我自己都觉得很奇葩。
chengxy 39
chengxy 2 天前
@ospider #19 听君一席话胜听一席话
JustinMsc 40
JustinMsc 2 天前
@wobuhuicode 兄弟,了解 dash 吗?
luny 41
luny 2 天前
一般公司的基础件或者核心框架都会基于 C++来写,特点就是代码量较大,参与人数比较多。
chenpingan 42
chenpingan 2 天前
@ospider 你搁这搁这呢
ws52001 43
ws52001 2 天前
底层架构,或者需要处理效率的接口项目。
hazardous 44
hazardous 2 天前
维护老的 MFC 程序
sryanyuan 45
sryanyuan 2 天前
四七层负载 中间件
Unclev21x 46
Unclev21x 2 天前
@Aresrun 如何看待*近比较流行的废话梗?反映了怎样的社会心理??
ipwx 47
ipwx 2 天前
@shijingshijing 可是 C++ 的 template 才是 zero-abstraction 的精华啊
SIGEV13 48
SIGEV13 2 天前
transaction framework, 搜索引擎等
zxCoder 49
zxCoder 2 天前
@ipwx 。。。。哈哈 大佬的话不可信
darknoll 50
darknoll 1 天前
没卵用了现在
Cloutain 51
Cloutain 1 天前
搬砖 还能干嘛
ufan0 52
ufan0 1 天前
怎么没有人提到做游戏呢
QBugHunter 53
QBugHunter 1 天前
@liuidetmks
有的。。。我现在正在做的项目,医用便携式 B 超。里面有个控制器,内存 32KB 。。。。
shijingshijing 54
shijingshijing 1 天前
@ipwx 别说 template,连 malloc 和 new 都不能用的,所有可能潜在有 undeterministic 特性的功能都不会用的,程序运行所需的 CPU cycle,memory,communication 等资源占用都要事先明确计算好,不得超过 50%。基本上就是用做硬件的思维来写软件。
ipwx 55
ipwx 1 天前
@shijingshijing 神 tm template undeterministic 。
shijingshijing 56
shijingshijing 1 天前
@ipwx [潜在]

只能说隔行如隔山,我要是告诉你,循环嵌套还约定不超过三层嵌套,你会不会更惊奇?

这些行业的规定和经验,都是经过一条条人命累计出来的。
tianming1992 57
tianming1992 1 天前
@ipwx 航天要求时序确定。在地面上的能够完全确定机器的状态,所以内存是定死的。用动态内存会带来不确定时序。
name1991 58
name1991 1 天前
@shijingshijing 火星车用的就是 C,而且全部是静态类型的的声明,
tianming1992 59
tianming1992 1 天前
我现在做自动驾驶决策规划算法,也是 c++,实时要求很强,而且车企巴不得用更搓的处理器来省钱。
ipwx 60
ipwx 1 天前
@tianming1992 可是,template 和动态内存毫无关系啊。。。倒不如说用了 template 让 C++ 省了很多需要动态内存申请的情况。不然怎么叫 zero-cost abstraction ?

另外 template poly 可以在不加虚函数表的情况下实现一定的继承多态之类的特性。

所以你到底会不会用 C++
ipwx 61
ipwx 1 天前
@shijingshijing (正常写函数都不敢循环嵌套三层, 不然根本没法维护)
bruce0 62
bruce0 1 天前
@ipwx 我理解的 template 会有 undeterministic 原因. 是因为使用了 template 后,代码是编译器生成的,(不同的编译器还有不同的实现方式)不是程序员手写的,可以了认为是潜在不可控的。

当然,C++ 构造函数,还有深拷贝,浅拷贝等等容易出错的坑。

所有 Linus 经常喷 C++是一门辣鸡语言
ipwx 63
ipwx 1 天前
@bruce0 可是,C++ 的 zero-abstraction 是有规范的啊。

在 template 方面根本就没有 UB 。如果你认为不是手写的就是 undeterministic,我觉得你应该用机器码才行啊。
ipwx 64
ipwx 1 天前
@bruce0 构造函数、深拷贝、浅拷贝,进化到 C++17 就是 move 语法等等。这些都是有规范的,一个能通过各种测试的编译器,用这些高级特性你都知道会发生什么。包括 -O3 。写出没有 Undefined Behaviour (遵守规范所以编译器也能给你完全能控制的代码)是 C++ 程序员重要的基本功啊。
ipwx 65
ipwx 1 天前
@bruce0 哦对用机器码也不保险。

如果你用的是通用芯片,现代通用芯片在机器码的下面都有很多你“控制不了”的行为。比如英特尔的芯片微指令,一个机器指令其实是拆成若干指令,然后在芯片上有指令流水线(同一瞬间其实有多个指令的不同步骤正在执行)。这些指令“并行”会导致一些 data harzard 。当然,芯片帮我们处理好了。

但是因为是并行流水线所以会带来一些其他问题。比如遇到条件判断,现代芯片都会猜测这条语句的结果,然后提前进入某个分支执行。如果猜错了就“回滚”。对,分值预测就会导致你“执行时间不可控”。

还有比如 cacheline 、L1~L3 cache,atomic 指令,store buffer queue (在一个核上非 atomic 指令更新数据,另一个核不一定马上能看到)。这些都是你“不可控”的抽象。

—-

现代计算机就是在一层一层你不可控的抽象上建立起来的。C++ 的各种语法和芯片上的这些复杂机制并没有本质差别。要理解、掌握这些抽象后面的原理,利用这些抽象才对嘛。
ipwx 66
ipwx 1 天前
@bruce0 说起指令流水线和 data hazard 其实还可能会产生指令的乱序执行。比如老生常谈的

if (condition) {
with (lock) {
if (condition) { …

这种 double-check-lock 在乱序执行面前会被虐成渣渣。解决方案是加入 memory fence 。

—-

总之为啥 C++ 难,是因为太靠近硬件,需要掌握这些底层抽象才能用好。
wutiantong 67
wutiantong 1 天前
@ipwx 我觉得无知者的道听途说根本配不上这么认真的回复啊
OneMan 68
OneMan 1 天前
嵌入式,音视频,性能强相关的,android 和 iOS 的底层一些开发,也都是 c++开发好提供接口给上层用。
bruce0 69
bruce0 1 天前 ❤️ 1
@ipwx 我工作不是写 C++的,只是偶尔用一下 C++,你说的很多深入的东西我也不太懂。我说不让用 template 的原因是我的理解,不一定正确(没有任何杠的意思,只是说一下我的看法)。C++相当于 C,确实会有一些容易出错的地方(特性太多了),不是这个语言不可靠,是写 C++的人,因为对 C++理解的不够深入导致的。有几个人敢说自己精通 C++,深入理解了各种实现细节。相对来说 C 就没有这么多容易出错的地方(因为特性少)

以前,看过一篇文章,说是 在汽车上写 C 程序,指针都不让用,不知道真假
spadger 70
spadger 1 天前
https://www.amobbs.com/thread-5754354-1-1.html
关于下单助手 3.4.0 以后版本崩溃及内存异常等问题的情况说明

1 、原来为了集成各种查看实物图、SMT 贴片效果图,我们在这个小助手上集成了我们自己的一些 C++程序。
而这种 C/S 架构的方式,有 bug 的情况下,更新迭代也非常缓慢。
现在我们已经接入 EDA 团队开发的基于 WebGL 的在线图形引擎,用以替换掉原来开发的这部分 C++程序。
这样子,才能做到快速在线迭代更新。

shijingshijing 71
shijingshijing 1 天前
@ipwx
@bruce0
@tianming1992

这里的 undeterministic 不仅仅是指技术上的,需要用 template 实现的函数大部分都是基础库之类的,实际作用是为了一次书写,适用多种类型,这种情况理论上是没问题的,可是在实际使用过程中,可能会碰到各种意想不到的问题,比如,嵌入式里面有很多 8 位,16 位,32 位不同类型的处理器,这时候假如函数里面使用了 Magic Number 作为参数,比如上限值,很有可能当参数为 32bit INT 类型没问题,但 8 位,16 位就会有问题。(你可以 Argue 说这是程序员素质的问题,但写函数的和用函数的人保不齐有一个没注意的,这样就会带来问题)

template 可以看作是一种语法糖,爽了开发,但是让后面的测试,追踪,certification 乃至出了问题做 Failiure Analysis 不确定性、复杂度和人力成本剧增,可能导致整个项目成本剧增,因此即使有这种场景,一般也是用宏定义来实现的,高可靠性的项目就是从技术上,管理上等各个方面来进行限制,尽*大能力保证不出问题,*好是从根本上消除产生问题的可能性。

这样来看,不能使用指针,不能动态分配内存,循环嵌套不能超过三层,不能使用递归等等神奇的限制也就合乎情理了。
shijingshijing 72
shijingshijing 21 小时 45 分钟前
@name1991 图像处理和路径规划用的“严格裁剪版 C++”,内存管理这一块 NASA 重新造了一套轮子,上两张图吧

b00tyhunt3r 73
b00tyhunt3r 19 小时 27 分钟前 ❤️ 1
@ipwx
他上 nasa 图了 确实写着不用 template * 1 分
该你反击了

(别问我,我就一不嫌事大吃瓜的?
ipwx 74
ipwx 17 小时 10 分钟前
@shijingshijing 那行吧,只能说这是用 human labor 堆出来的重量级工程。

但凡是地球上跑的软件项目就不走这条路了,因为这要花太多人力资源。
agagega 75
agagega 16 小时 51 分钟前 via iPhone
@shijingshijing
我大概没见过哪个语言标准库 IO 部分比 C++的 iostream 更不讨人喜欢的了
boyhailong 76
boyhailong 10 小时 30 分钟前
游戏开发
shijingshijing 77
shijingshijing 7 小时 55 分钟前
@ipwx 很多代码都是自动生成的,还有很多是复用以前经过 certification 的老项目代码,测试的时候需要的人多。要想系统可靠,就必须尽量使用简单的基础模块,然后尽可能复用,宁可简单的东西复用几万遍,也不会为了省事儿弄个新轮子,NASA 自己造内存管理的轮子是迫不得已,不然也不会用的。

这些项目里面,R&D 的 effort 只占 30%,剩下的几乎全部是 Documentation,Test,Certifiction 。
leafre 78
leafre 7 小时 50 分钟前
做各种轮子
youlemei 79
youlemei 7 小时 45 分钟前
做低延迟系统
plasmetoz 80
plasmetoz 7 小时 34 分钟前
给使用的数据库加自定义函数
name1991 81
name1991 7 小时 29 分钟前
@shijingshijing intresting
koala9527 82
koala9527 7 小时 24 分钟前
在嵌入式中还是有一席之地的,例如汽车故障诊断仪中解析 CAN 、LIN 通信协议消息
ipwx 83
ipwx 7 小时 10 分钟前
@agagega 这倒是,我也不爱用 iostream 。特别傻逼。
ipwx 84
ipwx 7 小时 9 分钟前
@shijingshijing 那毕竟是 NASA,业务其实很集中。

我是觉得人类如果要征服星辰大海,这种龟速推进宇航器肯定是不行的。SpaceX 我估计不是这种写代码的风格,那种才可能快速市场迭代。。。所以你说 NASA 这种项目管理好不好?好也不好。。。
ipwx 85
ipwx 7 小时 7 分钟前
@shijingshijing 就这么说吧。按照我的理解。为什么写航天器的代码这么局限?大概是因为上天的芯片太弱,给犯错边界太窄了(包括发动机也是),所以才容易出事。

为什么上天的芯片太弱?整体科技水平还不够强的芯片不出错。
—-

这是这个时代的局限性,我觉得也挺对。但是我也盼望将来上个天和出门打个出租车一样简单,那个时候的写航天器代码一定不会是现在这样了。
wangxn 86
wangxn 6 小时 34 分钟前 via Android
@ipwx 航天试错的成本太高,虽然火星车可以升级软件,但一开始就写好写正确更合适
ipwx 87
ipwx 6 小时 32 分钟前
@wangxn 嘛,所以才需要这么搞。

如果真有一天没有多大试错成本,或者这种慢吞吞的推进速度实在太慢了,那肯定就不会这么写了。
shijingshijing 88
shijingshijing 6 小时 10 分钟前
@ipwx

SpaceX 毕竟刚刚出大气层,还没遭受火星上各种宇宙射线,各种高能粒子轰炸,Elon Musk 本身把安全性看的也不高,成本和快速迭代占了较高的优先级,所以 Falcon 初期会各种炸,直到迭代出一个稳定的版本,NASA 经过了火箭,载人,登月,火星等各种毒打,思路是稳定优先。所以才会有 SpaceX 用 x86 来搞,NASA 坚持用 Radiation Hardened CPU,同样 Tesla 的车和丰田的车也可以类比。

外太空有很多其他因素要考虑,温差大(零下几百度到零上几百度),震动大,辐射大要防 SEU 处理,还要尽可能省电,优先保证安全性,还要*对的稳定,还要做 N 多冗余设计,这么多东西要考虑,整个系统设计思路跟地球上其他系统完全不一样。

当然,随着发射成本的降低,现在也有把 HP 的高性能计算集群发射到空间站进行就地处理的实验了,好像已经有初步的结果,不知道没经过上述处理,只是简单的做 ECC 是否能保证结果的正确性。
shijingshijing 89
shijingshijing 6 小时 6 分钟前
@ipwx

芯片不是太弱,性能根本不是优先考虑的选项,首先要考虑的就是尽可能不出错,当前芯片性能完全是过剩的。但是地球上普通的芯片是不能直接拿去用的,需要定制耐高温,抗辐射等特殊设计的 CPU 。

https://en.wikipedia.org/wiki/RAD750
CRVV 90
CRVV 5 小时 50 分钟前
@ipwx
从另一个角度来看这个问题,写 Linux 内核也不让用 exception template iostream 这些东西,这不是 NASA 才有的局限。而且很显然 Linux 内核的局限更严格。

C++ 本来就有很多种用法,可以当稍微多一点功能的 C 来用,也可以当随便写 usafe 的 Rust 来用。
NASA 这么规定很可能只是因为技术负责人和 Linus 有相同的观点而已。
Caturra 91
Caturra 5 小时 23 分钟前 via Android
@CRVV 我寻思 Linux 内核也不是 c++写的,根本用不了。不过假设可以用,感觉内核社区也不屑于用这些特性
leven87 92
leven87 4 小时 13 分钟前
跑在嵌入式设备上的训练模型
ipwx 93
ipwx 3 小时 55 分钟前
@shijingshijing 我说的“太弱”也包含了“不能在太空稳定运行”这件事。

@CRVV Linux 内核不用 exception / iostream 是因为内核态上面的操作太奇妙,以至于不能用这些。可以理解。但是内核存在的意义就是让别的程序能够用 exception / iostream 这些高级玩意儿,更快开发程序不是么 233

至于 template 。那主要是 Linux 觉得 C++ 不利于这么大接近硬件的项目去兼容“傻逼程序员”。

其实软件工程从一开始就是试图用更高层的抽象去封装更复杂的显示细节。只有封装了才能让更“傻逼”的程序员更快的出活。内核就是干这事的,对于内核不能用 C++ 我觉得非常非常可以理解。要我说,用 C++ 也不过是权益之道,如果将来有一个高级抽象,可以有 C++ 的(执行时间)可靠性和 Java/C#(程序开发)可靠性,我举双手双脚赞成。
—-

@shijingshijing @CRVV 所以我的论点倒不是说 C++ 多牛逼,大家一定要用 C++。而是觉得在 C++ 和 C 之间,C++ 提供的东西更多,理论上更容易出活。这个论调肯定没问题,不然游戏引擎为啥不用 C 写而用 C++ 写是不是? C++ 开发速度 > 砍掉很多东西的 C++ > C 这是客观事实,不然 NASA 为什么不用裸 C 呢?

只是感叹这种抽象和硬件条件(包括物理学、发动机之类的制造水平)还不足以让星辰大海的征途一路通畅、高效快速前进罢了(叹息)
ipwx 94
ipwx 3 小时 53 分钟前
@shijingshijing

> SpaceX 毕竟刚刚出大气层,还没遭受火星上各种宇宙射线,各种高能粒子轰炸,Elon Musk 本身把安全性看的也不高,成本和快速迭代占了较高的优先级
—–

事实上我觉得这才是快速进入太空时代必要的。NASA 这种慢吞吞的风格才是权宜之计。
shijingshijing 95
shijingshijing 3 小时 24 分钟前
@ipwx

其实软件工程从一开始就是试图用更高层的抽象去封装更复杂的显示细节。

这一点你说的没错,事实上从抽象这个功能来讲,C++既需要做抽象,又要放不下底层,还要兼顾各种特性,于是造成了本身无比的复杂。现在普遍引入了 MBSE,基于 UML/SysML 在更高层级上建模,然后直接生成 C 代码,*终编译成机器码直接执行。这种模式已经是大的趋势了。UML/SysML 专门负责抽象,C 负责底层,就这样两层就够了。所以这样看,C++就没什么意义了,两头兼顾两头都做不好。这也注定了即使用 C++,也是在某个领域某个模块(比如图像视频处理)非用不可的情况下,才会使用,而且限制及其严格。

还有就是 NASA 并不慢,一套系统不是只要搞软件就能 run 起来的,在软件上面还有更高层的系统级的考量。基本的飞行系统架构,*顶层是飞行器系统,然后分解为推进子系统,动力控制子系统,环境控制子系统,电气子系统,电子子系统等等,这些子系统里面再进一步细分为机械模块,硬件模块,软件模块等模块,所以至少是三个层级。比如推进子系统,机械模块分为发动机喷嘴,燃料阀门,点火装置,压力检测等子模块; 硬件模块对应有发动机喷嘴控制器,燃料阀门控制器,点火装置控制器,压力检测传感器等硬件设备;然后才是运行在这些控制器里的软件模块。所以整体是一个非常庞大的系统,不止一个 CPU,不止一种 CPU,不像做个 App 什么的打开 IDE 就能写。

NASA 的系统工程和软件工程都是一流的,很多软件领域的概念和方法都是由 NASA 或者其他航空航天巨头首先提出,然后才慢慢引入到软件领域的,特别是测试领域,比如 MC/DC 。Elon Musk 纯粹是莽,没把安全性放在首位,如果一定要类比,我觉得 NASA 是传统类型的软件厂商,SpaceX 是互联网厂商。
CRVV 96
CRVV 1 小时 41 分钟前
@Caturra
这里有个因果关系的问题,因为 Linus 不喜欢 C++,所以内核才不用 C++。他不喜欢 C++ 的原因当然是 C++ 比 C 多的那些功能。
另外 Linux 内核已经开始用 Rust 了。
rainfd 97
rainfd 1 小时 18 分钟前
cuda

C++里面的iostream是什么

刚接触c++,我感觉很有意思,记录C++走过的坑

C++编译系统提供了用于输入输出的iostream类库。iostream这个单词是由3个部分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的类。

%title插图%num

ios是抽象基类,由他派生出istream类和ostream类,两个类名中*个字母i和o分别代表输入(input)和输出(output)。isrream类支持输入操作,ostream类支持输出操作,iostream支持输入输出操作。iostream是从istreanm类和ostream类通过多重继承而派生的类。

C++对文件的输入输出需要用ifstream和ofstream类,两个类名中*个字母i和o分别代表输入输出,第二个字母f代表文件(file)。ifstream支持对文件的输入操作,ofstream支持对文件的输出操作。类ifstream继承了istream,类ofstream继承了ostream,类fstream继承了iostream。

#include的意思提供iostream库中的信息,在程序开头写上这个才可以直接调用iostream类库中的函数.

include这个文件后,才能使用cin和cout。
准确地说,iostream是一个C++标准库的头文件。标准库的标准的含义就是说每个C++编译器都要自带的,无论用什么C++编译器都会有的,而且用法和行为是一样的。头文件内包含的只是你所使用的标准库内的类和函数的声明,实际上标准库的代码是编译好的(或者是类模板,这种情况会直接写在头文件中),你include这个头文件只是告诉编译器我要使用这里声明的东西,然后编译器负责将实际的库函数和你的代码一起生成exe文件。
你可以自己查找一下这个文件,这个文件就叫iostream没有扩展名,然后里面会include其他的头文件,你可以一层一层找下去看看cin和cout是怎么回事。
一见到 IO 这两个字母,基本上就是input 和output的缩写了,含义比较广泛,泛指计算机的输入和输出,不一定指iostream

C++ 中 Lambda 对变量的捕获居然是在声明时就做了

我看到在 C++ 14 特性中支持 Lambda 表达式捕获 move-only 的类型(原先是引用或值传递),于是写了一个小 demo:

auto p = std::make_unique<int>(1);
auto task1 = [p = move(p)](){ *p = 5; };
cout << *p << endl;
上述代码可以通过编译,但是运行时出现 core dump ,明显是因为此时 p 已经被 move 到 Lambda 表达式中去了,这里就迷惑,我一直以为要 auto task = [](){…}(); 或是 task1(); 执行时才会做参数的初始化(类似函数那样),但从结果来看,从声明的那一刻变量就已经被捕获了。

虽然这一点对原本的值传递和引用捕获的参数来讲没有什么感知,但是对于捕获 move-only 类型的函数确实会产生一定的影响,因为从 Lambda 声明的这一刻开始你原本的外部变量就不能使用了。

另外被捕获到 Lambda 内部的 move-only 变量是以类似 static 的状态存在的,即多次调用 task 对 *p 的改变会累积,以这个 demo 可以看的比较清楚:

auto p = std::make_unique<int>(1);
auto task1 = [p = move(p)](){
(*p)++;
cout << *p << endl;
};
task1();
task1();
task1();
task1 lambda auto 捕获6 条回复 • 2021-07-16 13:50:11 +08:00
wutiantong 1
wutiantong 1 天前 ❤️ 1
lambda 就是这样的,
你定义它时,你实际上是创建了一个匿名类型的 functor object,
而捕获列表中定义的都是这个匿名类型的成员变量,
所以,并不是 static 的,而是成员变量的。
nightwitch 2
nightwitch 1 天前 ❤️ 1
其实仔细想想就会发现你的思路不合理。
比如考虑一个 taskQueue,一个 lambda 会被推到这个队列里,而可能要等前面的任务都执行完毕以后才会执行。
如果 lambda 不在声明的时候拷贝 /移动变量,那么当 taskQueue 排到的时候可能这个变量生命周期早结束了。

lambda 其实是一个语法糖,本质上是声明一个重载了 operator()的 struct,auto task1 = []()… 类似于实例化这个结构体。
ipwx 3
ipwx 1 天前
楼主可能和 JS 搞起来了。但是 JS 那种其实不是更奇怪吗。

for (int i=0; i<10; ++i) {
task_list.emplace([i] () { std::cout << i << std::endl; });
}

这种用法不挺符合常识吗?
hitmanx 4
hitmanx 1 天前
“.. 但从结果来看,从声明的那一刻变量就已经被捕获了。虽然这一点对原本的值传递和引用捕获的参数来讲没有什么感知”..

Really?以值 capture 一样有感知

int main()
{
….int a = 1;
….auto func = [a]() { std::cout << a << std::endl; };
….a = 2;
….func();
….return 0;
}
mer 5
mer 1 天前
@wutiantong 原来是这样
@nightwitch 懂了
@ipwx 没用过 JS
@hitmanx 噢 我说的值传递不是这个意思,忘了考虑这种值 Capture 的,一般用 引用 capture 和,值传参
aneostart173 6
aneostart173 43 分钟前
跟 rust 一样啦?

深度学习之在iOS上运行CNN

1 引言
作为曾经的iOS开发者,在研究深度学习的时候,总有一个想法就是在iPhone上运行深度学习,不管是在手机上训练还是利用训练好的数据进行测试。
因为iOS的开发环境支持C++,因此,只要你的代码是C/C++,本质上就可以在iOS上运行。
怎么才能更快更好地在iOS上运行CNN呢?

2 方法1:通过Matlab转码
Matlab自带转成c的工具,如果你研究过UFLDL的深度学习教程,就知道如何在Matlab上使用CNN,那么,转换成c后,放到iOS的开发环境中,然后将参数存成txt格式再读取分割,也就是可以实现。
如下图就是已经将matlab代码转换为c后导入的结果:

%title插图%num

打开predict.h文件,可以看到可以调用的接口:

/* Function Declarations */
extern real_T predict(const real_T Theta1[10025], const real_T Theta2[260], const real_T X[400]);
1
2
3
这是训练MNIST的一个神经网络,我这边用了测试手写数字的识别。

因此,接下来需要对图片进行处理,从而转换为x[400]的向量格式。

这个只要能读取图片的像素,进行转换就可以。可以考虑用opencv来实现。

%title插图%num
这里我的方法是在用手画出数字之后,将图片转换为20*20像素的图片,如右下角所示,再将右下角的图片转换为400的数组,输入predict得到的结果。

3 方法2:使用DeepBeliefSDK
https://github.com/jetpacapp/DeepBeliefSDK
这个是别人专门写的一个用于iOS的深度学习的SDK。可以使用,但是存在的问题就是如果要自己训练的话很受限制。

4 方法3:使用tinyCNN
https://github.com/nyanp/tiny-cnn
这个很不错,它对比Caffe,Theano等框架*大的特点就是不需要安装,只要能用C++ 11.然后里面的例子使用了boost库。因此,为了运行它,我们需要在xcode安装ios的boost库。

网上找到了一个编译好的boost库:
https://github.com/danoli3/ofxiOSBoost

导入boost库的方法非常简单:

In Xcode Build Settings for your project:

Add to Library Search Paths ( LIBRARY_SEARCH_PATHS ) $(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/lib/ios
Add to Header Search Paths ( HEADER_SEARCH_PATHS )
$(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/include
In the Target under Build Phases

Add to ‘Link Binary With Libraries’ the boost.a found in the ofxiOSBoost/libs/boost/lib/ios directory.
If not openFrameworks just add the libs/boost/include to Header Search Paths and the libs/boost/ios to Library Search Paths

那么具体在创建iOS应用的时候,这里使用作者提供的训练MNIST的例子,那么要注意在使用数据时,要更改路径:

NSString *trainLabels = [[NSBundle mainBundle] pathForResource:@”train-labels” ofType:@”idx1-ubyte”];
NSString *trainImages = [[NSBundle mainBundle] pathForResource:@”train-images” ofType:@”idx3-ubyte”];
NSString *t10kLabels = [[NSBundle mainBundle] pathForResource:@”t10k-labels” ofType:@”idx1-ubyte”];
NSString *t10kImages = [[NSBundle mainBundle] pathForResource:@”t10k-images” ofType:@”idx3-ubyte”];

parse_mnist_labels([trainLabels cStringUsingEncoding:NSUTF8StringEncoding], &train_labels);
parse_mnist_images([trainImages cStringUsingEncoding:NSUTF8StringEncoding], &train_images);
parse_mnist_labels([t10kLabels cStringUsingEncoding:NSUTF8StringEncoding], &test_labels);
parse_mnist_images([t10kImages cStringUsingEncoding:NSUTF8StringEncoding], &test_images);

基本上这样就可以运行开始训练了。

如果想在Mac上训练,同样需要安装boost库。这个只要在官网下载boost,我用的是1.58版本。然后在terminal中安装,cd到路径,然后./boostrap.sh 然后./b2 安装就可以。然后在xcode引入路径:

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/Users/…/…/…/boost

The following directory should be added to linker library paths:

/Users/…/…/…/boost/stage/lib

路径初始为自己boost的文件夹地址。

4 小结
上面说了一些很方便的方法来实现在iOS下运行CNN。当然,我们更多需要就是进行图像的识别。相信大家自己测试会觉得很有趣。

快速学习android开发

因为项目需要,8月中旬开始决定做安卓的程序,所以马上就开始学习安卓方面的开发知识,把*近的学习实践经历和大家分享分享。不要一开始就下载一大堆资料,视频,然后就不知道做什么了,要给自己定个目标,我要做什么?我怎么达到目标?

我不懂java,但是懂C#和C++,所以我没主张去单独学习java语言,如果你是个**初的新手,没啥语言基础,那你必须先看看java语言,不要很详细看,因为学习Android中,你也是在学习java。

1. 明确目标

没有目标的学习,会感觉到后面没什么成果,在1年前,我也打算学习android开发的,但是目的就是学习,到网上去下载很多学习的视频,然后把开发环境搭建起来,能把Helloworld运行起来,能打些log,Activity之间也能互相切换了,但是后面也就不了了之了,因为不知道学了要干什么。依葫芦画瓢的做了几个例子,因为里面的问题都是已经解决的,所以也没能深入的系统学习。

这次因为产品的需要,要做Android版本,要做的东西一开始就已经设计好了,见摇摇2选1安卓版本,刚开始也不知道里面有些什么技术难度,但是要做的目标已经明确了,而且也没有现成的,碰到问题就查资料,慢慢地解决,这样有的放矢,学习的效果非常好。既有现成的技术可以使用,又有些技术,需要查比较多的资料,这样记忆就比较深刻,所掌握的知识也比较系统。

接下来的一系列文章,我会把在开发摇摇2选1中遇到的问题,给大家详细讲讲,程序虽然小,但是五脏俱全,做Demo和做产品的要求完全不是一个级别,如果Android大牛感觉知识讲的比较浅,那可以绕道,毕竟我是从一个完全的新手开始的。

 

2. 了解安卓开发中比较困难的地方

学习一个新平台,就要知道此平台开发要面临的困难有哪些,不要做到*后,这些问题没有考虑,那就比较糟糕了。在网上搜索了下,安卓开发困难总结如何:

1)安卓系统版本比较多,各版本之间的兼容性是个问题,此为系统碎片。

2)安卓设备千变万化,设备难以统一,每个产品都成为独立,分散的Android碎片。

3)分辨率五花八门。一个产品,可能需要多个界面排版,人工消耗比较大。

%title插图%num

看到这张图,有没有头疼的感觉?

总结成一句话:Android的碎片化真是要来开发者的命。

 

3. 搭建开发环境

“巧妇难为无米之炊”,开发环境肯定是*件要做的事情,这类的文章已经很多了,我也不多说了,多说也就比较无聊了。感谢吴秦,也是博客园里的一员,他写的很详细了,见这里。

 

4. 查看网友总结的一些经验。

不是什么都查看,开发中遇到什么问题,就去查看什么问题,这样你查到的知识,马上就能深入的实践,这样知识就巩固了。

1)首先当然要看Android的开发文档,里面其实大部分的知识都有了,还有就是SDK自带的Samples。

2)博客园里搜索“Android开发”,会出来一大把,很多网友都是很系统的讲解了。

3)eoe android社区,里面有很多网友上传了现成的demo代码,里面很多都是模仿现在流行的产品的界面开发,很是不错。

 

5. 掌握调试方法

个人一直认为,调试技巧是开发中*重要的技能,如果调试技能比较差,不知道如何查找问题,那不会是个好的程序员,其技能也不会高到哪里去。

 Android做下来,感觉调试这块做的很不错了,这要感谢Eclipse IDE做的比较不错,但是Android的界面排版部分,真的不敢恭维,Eclipse时间用长了,占用内存真是大。有哪位高手能否告诉我下,你们界面排版是用什么的?

Android里,如果程序出了问题,有些是一下跟踪不到的,这时就要用到Log类了,Log类使用很简单,就不多说了。
 自己一个很有感触的经验,如果你真的打算做Android开发,那就买一个设备,这样能大大提高开发效率,模拟器有时用起来真是麻烦,而且开发的设备不要很好的,只要设备分辨率是主流的,传感器的支持*好全点就够了,国产的手机里,华为的还不错,或者到淘宝上去买个二手的,投资不大。真的买了投资,可能也会增加你学习Android的决心。

 

6. 程序框架

经过10多年的经历,认识到程序的框架对开发产品真的是起到举足轻重的作用。一个好的产品,如果有个好的程序框架,那真是事半功倍,可能开始所做的工作会比较多,很难看到令人激动的成果,但是相信我,*对值得。一开始,我也是比较注重程序界面开发,很快就开发出界面来,而且着实比较激动,因为有东西出来了,但是后面的事情,真是令人发狂,想从头再来,太迟了,离计划的时间比较近了,时间不允许,只有硬着头皮往上打补丁,硬着交付*个版本,第二个版本或者后面的版本,迟早是要重来的。所以在后面带领团队开发的时候,在开发前,都是要讨论程序框架,留出很大部分时间进行程序框架开发,及在开发中不断的改进。

刚接触Android,不知道用什么程序框架,所以查了很多资料,一开始看到一个程序框架,感觉很不错,所以一开始就使用了下面这个程序框架。

%title插图%num

开始这个框架用的蛮爽,简单介绍一下,主UI线程如果要做一个比较长时间的任务,创建一个任务,发送到任务队列中去,后台的Service不断的从任务队列中去取任务,然后交给线程处理,线程处理完后,通过消息(Message)发送到Handler里处理,然后Handler的handleMessage函数里回调到UI主线程中去。

此框架的缺点是比较麻烦。

1)首先这里有个Observer模式,每个Activity都要实现一个接口,然后注册到后台服务中去,这样后台服务才能把处理的结果回调到主线程中。

2) 每个事件都要组成一个任务,发送到任务队列。

3)后台线程先要取任务,然后处理,然后通过消息切换到主线程,然后又回到到相应的Activity中,中间有个3次判断当前是什么任务。

4)不能并非,任务只能一个接一个,虽然这个一般不会造成瓶颈。

因为摇摇2选1应用比较简单,所以后来感觉只要使用线程和Handler,通过消息就能处理,然后就查资料,发现已经有比较多的文章描述了这种方法,只是没提出这是一个框架,但是对摇摇2选1,我感觉已经足够了。下面就是主代码,分布在每个Activity中:

private void TaskThread()

{

Thread taskThread = new Thread()

{

@Override public void run()

{

//做耗时的任务

Message msg = Message.obtain();

msg.what = 1;

uiCallback.sendMessage(msg);

}

};

taskThread .start();

}

private Handler uiCallback = new Handler()

{

@Override public void handleMessage(Message msg)

{

if(msg.what == 1)

{

//在主线程中处理结果

}

}

};

 够用就好,至少我现在用着很爽。

 

7. 程序国际化

互联网让地球成为一个村,所以一开始也需要了解一下程序是如何做国际化版本的。不要一开始字符串满天飞,整个程序中都存在hard code,这样做,迟早是要吃亏的。

 

8.产品升级机制

一个方便的产品升级机制,对产品的成长很重要,android是一个开放平台,在这点上比iOS做的好的多,产品升级很方便。

 

此文章的目的就是对想学Android开发的人一个指引,因为我也就是这么走过来的,加上自己在软件开发上的一些经验,让新手少走弯路。有计划,有目标的学习,这是*好的方法。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速