N******K 发帖数: 10202 | 1 struct pixel
{
double a // 8 byte
double b // 8 byte
}
auto pointer = new pixel[10]
pointer += 9
这个计算 是怎么实现的
是不是 逻辑上相当于 **pointer += 9*16
**pointer是指针的值 uint64类型 内存单元为byte |
A*****i 发帖数: 3587 | 2 多年不用C++了auto是嘛玩意?auto_ptr么? |
N******K 发帖数: 10202 | 3 不用手动写出类型 编译器自动识别
【在 A*****i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 多年不用C++了auto是嘛玩意?auto_ptr么?
|
b*******s 发帖数: 5216 | 4 新关键字,有点类似动态类型特性的,但实际上不是
【在 A*****i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 多年不用C++了auto是嘛玩意?auto_ptr么?
|
N******K 发帖数: 10202 | 5 这好东西 一下子代码就干净了
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 新关键字,有点类似动态类型特性的,但实际上不是
|
b*******s 发帖数: 5216 | 6 不管是原生的还是stl,指针加都是加sizeof(T),所以如果容器里实际进去的是派生类,
你要当心了
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : struct pixel : { : double a // 8 byte : double b // 8 byte : } : auto pointer = new pixel[10] : pointer += 9 : 这个计算 是怎么实现的 : 是不是 逻辑上相当于 **pointer += 9*16 : **pointer是指针的值 uint64类型 内存单元为byte
|
b*******s 发帖数: 5216 | 7 嗯,如果不滥用,比如给一个auto赋值为另一个已有的auto,这个破坏可读性的
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这好东西 一下子代码就干净了
|
A*****i 发帖数: 3587 | |
b*******s 发帖数: 5216 | 9 17标准马上可能要有可选的gc了,怕不怕?
【在 A*****i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我擦,这是要动态语言的节奏么? : 妈蛋啊
|
A*****i 发帖数: 3587 | 10 操,老子还是喜欢挪指针啊,要GC去找爪哇好吗,没节操的 |
|
|
b*******s 发帖数: 5216 | 11 可选模式,而且不一定委员会会批,就是个别人在鼓吹
【在 A*****i 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 操,老子还是喜欢挪指针啊,要GC去找爪哇好吗,没节操的
|
N******K 发帖数: 10202 | 12 boost 里面有没有?
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 可选模式,而且不一定委员会会批,就是个别人在鼓吹
|
b*******s 发帖数: 5216 | 13 现在还木有,我对此表示不赞成 :)
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : boost 里面有没有?
|
a***n 发帖数: 538 | |
z****g 发帖数: 75 | 15 type inference, c++11
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : struct pixel : { : double a // 8 byte : double b // 8 byte : } : auto pointer = new pixel[10] : pointer += 9 : 这个计算 是怎么实现的 : 是不是 逻辑上相当于 **pointer += 9*16 : **pointer是指针的值 uint64类型 内存单元为byte
|
N******K 发帖数: 10202 | 16 有gc了 怎么用指针? 是不是就没指针了
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 现在还木有,我对此表示不赞成 :)
|
N******K 发帖数: 10202 | 17 我说的是具体实现 pointer += 9 是纯加法计算 还是加法和乘法计算
【在 z****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : type inference, c++11
|
b*******s 发帖数: 5216 | 18 gc只是一种pattern,你觉得c++会绑死在一种pattern上么? c++就算有gc也不会是jav
a那种基于jvm的,多半是一种类似内存池,然后根据ref count判定可否利用的那种,没
有新的分配需求,不会人为搞个什么工作线程去干预的
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 有gc了 怎么用指针? 是不是就没指针了
|
b*******s 发帖数: 5216 | 19 sizeof * num
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我说的是具体实现 pointer += 9 是纯加法计算 还是加法和乘法计算
|
z****g 发帖数: 75 | 20 先infer出来type, 然后那个type几个字节,就自动算了
你这个 express的语义就是:移动这个类型的指针向前9个单位,单位是编译器静态
type inference出来的 |
|
|
b*******s 发帖数: 5216 | 21 对,sizeof是编译期决定的
【在 z****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 先infer出来type, 然后那个type几个字节,就自动算了 : 你这个 express的语义就是:移动这个类型的指针向前9个单位,单位是编译器静态 : type inference出来的
|
a***n 发帖数: 538 | 22
jav
,没
boost的shared ptr就是,不是一般的慢。
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : gc只是一种pattern,你觉得c++会绑死在一种pattern上么? c++就算有gc也不会是jav : a那种基于jvm的,多半是一种类似内存池,然后根据ref count判定可否利用的那种,没 : 有新的分配需求,不会人为搞个什么工作线程去干预的
|
b*******s 发帖数: 5216 | 23 慢?不太可能,下次我来写个帖子分析下shared_ptr的设计吧
【在 a***n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : jav : ,没 : boost的shared ptr就是,不是一般的慢。
|
a***n 发帖数: 538 | 24
用cpu profiler看一下用就知道ref count有多耗时了。
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 慢?不太可能,下次我来写个帖子分析下shared_ptr的设计吧
|
N******K 发帖数: 10202 | 25 那种开销 可以直接忽略
我对比过 for{ new delete} vs for {shared_ptr} 10000个对象 似乎是1~2秒的差
别(改天我再跑一下 更新一下这个数字)
【在 a***n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 用cpu profiler看一下用就知道ref count有多耗时了。
|
b*******s 发帖数: 5216 | 26 嗯,有空了我先做个benchmark,先介绍下你怎么做的?
【在 a***n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 用cpu profiler看一下用就知道ref count有多耗时了。
|
a***n 发帖数: 538 | 27
曾今调试一个新手的程序,发现5%的时间是ref count。其实也没有什么太过分,不过
显然不够快。
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 嗯,有空了我先做个benchmark,先介绍下你怎么做的?
|
t****t 发帖数: 6806 | 28 这个看怎么用了. 如果完全无脑见一个copy一个, 那肯定开销大没话说. 但是多数情况
下不需要.
【在 a***n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 曾今调试一个新手的程序,发现5%的时间是ref count。其实也没有什么太过分,不过 : 显然不够快。
|
d****n 发帖数: 1241 | 29 * 首先,struct的大小依赖于两个因素,一是field的大小,二是field的alignment,
这两个都是由ABI决定的,比如在64位的机器上,如果编译器选择遵守gcc/llvm所支持
的x86_64 ABI标准,那么double是8byte对齐,如果在32位的机器上,linux下gcc支持
的x86 abi是4byte对齐. 大小的话,double类型都是8 bytes. 在缺省情况下,如果某
个field不符合对齐标准,那么编译器会插入padding bytes,让这个field符合对齐的
标准。比如:
struct S {
char f1; // size是1,对齐是1
int f2; // size是4,对齐也是4
};
sizeof(struct S)是8,因为编译器会在f1后,加入3个padding bytes, 让f2符合对齐
的规范。
* 如果在定义struct的时候,添加了类似packed的attribute, 那么编译器会忽略对齐
的要求。
* auto跟动态类型没有关系,在你的例子里,pointer类型是编译器在静态的时候,根
据一定的类型推导规则,自动推导出来的,跟定义
pixel *pointer = new pixel[10];
一样,在你使用pointer的时候,pointer就是这个类型;
* pointer += 9计算之后,pointer会指向数组pixel第10个元素.
pointer加一,表示移动一个sizeof(pixel)距离
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : struct pixel : { : double a // 8 byte : double b // 8 byte : } : auto pointer = new pixel[10] : pointer += 9 : 这个计算 是怎么实现的 : 是不是 逻辑上相当于 **pointer += 9*16 : **pointer是指针的值 uint64类型 内存单元为byte
|
b*******s 发帖数: 5216 | 30 真牛人来了,出来拜一下
【在 t****t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个看怎么用了. 如果完全无脑见一个copy一个, 那肯定开销大没话说. 但是多数情况 : 下不需要.
|
|
|
z****g 发帖数: 75 | 31 这个效率一般是个小问题
用shared ptr 让人觉得没有明确得ownership,概念不清楚,不符合C++程序员
对确定性的期待,搞的堕落成Java,不喜欢
不过个别时候也没更好的选择
【在 t****t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个看怎么用了. 如果完全无脑见一个copy一个, 那肯定开销大没话说. 但是多数情况 : 下不需要.
|
N******K 发帖数: 10202 | 32 我举个例子
矩阵加法 每个都是1024x0124大小
A=B+C+D
具体这样 temp1=B+C; temp2=temp1+D; A=temp2;
这里面很多数据共享的问题
比如 简单的 A=B;
A是一个矩阵 A=B 是不是要把所有元素都复制一遍? 显然不用
A.data=B.data; 就行了
A.data 可以是 shared_part
如果要对A只做读操作 A不用重新分配一块内存
如果要对A做写操作 那就测试一下A.data有没有别人在用 还有人用的话 那就复制一块
A重新分配一块内存 复制A.data指向的数据
当然 你要搞多线程 多个线程写一个矩阵 会出问题 你要加锁
锁。lock()
测试一下A.data有没有别人在用 还有人用的话 A重新分配一块内存
锁。unlock()
不过 数值计算一般不会这么搞
如果B没用了 析构函数里面 {data.reset()} 就可以了 不会把数据真给删掉了
【在 z****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个效率一般是个小问题 : 用shared ptr 让人觉得没有明确得ownership,概念不清楚,不符合C++程序员 : 对确定性的期待,搞的堕落成Java,不喜欢 : 不过个别时候也没更好的选择
|
N******K 发帖数: 10202 | 33 这也是我为什要自己写matrix类的原因 因为可能要多线程等等
eigen类库有个搞笑的bug 还不好意思说是bug
a=a.transpose(); 这个结果就会出错 不知道怎么搞的
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我举个例子 : 矩阵加法 每个都是1024x0124大小 : A=B+C+D : 具体这样 temp1=B+C; temp2=temp1+D; A=temp2; : 这里面很多数据共享的问题 : 比如 简单的 A=B; : A是一个矩阵 A=B 是不是要把所有元素都复制一遍? 显然不用 : A.data=B.data; 就行了 : A.data 可以是 shared_part : 如果要对A只做读操作 A不用重新分配一块内存
|
d****i 发帖数: 4809 | 34 C++若引入GC的话,我第一个反对,直接用我的C或者C++98去,或者干脆上Java了。
【在 b*******s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 可选模式,而且不一定委员会会批,就是个别人在鼓吹
|
h*******u 发帖数: 15326 | 35 这个不用。net用不到
【在 a***n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 曾今调试一个新手的程序,发现5%的时间是ref count。其实也没有什么太过分,不过 : 显然不够快。
|
l*********s 发帖数: 5409 | 36 It is useful (1) for RIIA (2) library interface.
【在 z****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个效率一般是个小问题 : 用shared ptr 让人觉得没有明确得ownership,概念不清楚,不符合C++程序员 : 对确定性的期待,搞的堕落成Java,不喜欢 : 不过个别时候也没更好的选择
|
h*******u 发帖数: 15326 | 37 矩阵类关键看你想怎么玩线性代数算法
要么用现成类库,但是接口在那摆着
要么自己写矩阵,但是上层要自己搞
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这也是我为什要自己写matrix类的原因 因为可能要多线程等等 : eigen类库有个搞笑的bug 还不好意思说是bug : a=a.transpose(); 这个结果就会出错 不知道怎么搞的
|
o**o 发帖数: 3964 | 38 矩阵库干嘛重写。多半没有现成的好。
【在 h*******u 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 矩阵类关键看你想怎么玩线性代数算法 : 要么用现成类库,但是接口在那摆着 : 要么自己写矩阵,但是上层要自己搞
|
h*******u 发帖数: 15326 | 39 我曾经写过一个,模版的。开始方便无比。后来要上各种分解求逆特征值的时候煞笔了
,要造无数轮子。
干脆直接上GSL了事,性能还不错,哈哈
【在 o**o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 矩阵库干嘛重写。多半没有现成的好。
|
t****t 发帖数: 6806 | 40 要是为这种事情重写matrix类那真是吃力不讨好. matlab从很早开始就是copy-on-
write了.
【在 N******K 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这也是我为什要自己写matrix类的原因 因为可能要多线程等等 : eigen类库有个搞笑的bug 还不好意思说是bug : a=a.transpose(); 这个结果就会出错 不知道怎么搞的
|
|
|
t****t 发帖数: 6806 | 41 滥用当然是不行的.
但是有些事情就是没有ownership, 你硬要搞一个ownership出来也不见得自然. 比如对
表达式的evaluation, 我觉得用一个shared_ptr是个可以接受的方案, 即
immutable value. 但在对lvalue进行支持的时候显然就必须换一个类型.
【在 z****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个效率一般是个小问题 : 用shared ptr 让人觉得没有明确得ownership,概念不清楚,不符合C++程序员 : 对确定性的期待,搞的堕落成Java,不喜欢 : 不过个别时候也没更好的选择
|
N******K 发帖数: 10202 | 42 当然不是为了这个了 吃饱了撑的重复劳动
【在 t****t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 要是为这种事情重写matrix类那真是吃力不讨好. matlab从很早开始就是copy-on- : write了.
|