登录 立即注册

找到608个回复 (用户: 无名啊)

无名啊 45楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,感觉 43 楼的设计,没法加 restrict

那岂不读指针和结束指针都没法缓存至寄存器,每次读取前都要读一次内存?(因为编译器认为,写指针可能会修改 char *read_next, *end?)

无名啊 43楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,画了个草图,容易理解:
image.png(13.01 KB)

无名啊 39楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,写指针 和 读指针,都指向同一块缓冲区。只是写指针写入过后的字符对象,都绝不再读取。(因为写指针不会超出读指针,如上所述)

无名啊 38楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,只是【通过 char * restrict 修改后,不再使用其他别名】,也不行?

因为解析了一个字符,并写入后,就不再需要读取这个及之前的字符对象了

无名啊 37楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,“对象类型”是指非函数类型。。

另外,只是指向 char 类型的读写指针。

另外,根据严格别名说的,char * 可修改任何类型的数据。

所以,我认为给 char * 添加 restrict,可防止【写指针写入数据后,编译器认为所有指针的数据缓存都失效不能用了,需要重新读取】。

不知这个想法对不对

无名啊 34楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,我在给 SQLite 写流式解析 csv 的小插件,想只用一个缓冲区存储:数据块、某一行解析好的CSV数据。

比如,读取 4K 数据,然后边解析,边往这个缓冲区开头写入。

由于 CSV 数据解析完不会需要更多内存来存储,只会由于转义变得需要更少内存,所以不会发生写指针超出读指针问题。

所以,我在想写指针能不能加 restrict?加了有没有用?读指针需要加 restrict 吗?

无名啊 32楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,另外,我这篇帖子,主要是想讨论 restrict 的(因为我已经认下严格别名了)。。

我刚才看了看你一开始的其他回复。

我认为,根据 cppreference 对 restrict 的叙述,应该是允许有其他别名的。

只要保证:通过 restrict 修饰的指针写入某个对象后,不再使用其他别名访问这个对象,即可?

无名啊 30楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,关于联合体,应该只有 C 能用,C++ 不能:

cppreference - 联合体 - 解释 说:

联合体的大小仅足以保有其最大的数据成员。其他数据成员在该最大成员的一部分相同的字节分配。分配的细节是实现定义的,且读取并非最近写入的联合体成员是未定义行为。许多编译器以非标准语言扩展实现读取联合体的不活跃成员的能力。

无名啊 28楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,诶,好像只是访问时 UB 噢,转换指针类型应该没问题?

无名啊 27楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,比如,(long *)&y,编译器认为结果是 NULL。。。

无名啊 25楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,万一哪天,编译器改成,看到不兼容类型的指针转换,后续都不管对这个对象的任何操作了,咋办?

反正也符合标准。。

无名啊 24楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳( long * ) &y 这个是左值吗?解引用后,类型是 long,不是字符类型,与 float 也不是兼容类型,所以应该是未定义行为

我 C/C++ 写得不多,现在看到那篇文章,就更怕编译器没能正确实现 UB 了。。

无名啊 22楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,我没能力修改 gcc,所以就认了。要么加 -fno-strict-aliasing,要么用 memcpy,来防止结果出错。

但这还会影响到性能低下问题(特别是修改了 char * 后,编译器会认为一大堆对象有可能被修改了,所以缓存失效,需要重新读取),所以我要搞懂 restrict

无名啊 20楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,cppreference 说,这是 UB:

image.png(64.78 KB)

无名啊 19楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,你看下知乎上的 一个回答

无名啊 17楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,按照标准,可能根本不会发生解引用指向float值的long指针,因为可能已经被优化掉了。。也就没有你后面说的浮点定义如何如何……

无名啊 15楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,如果按 cppreference 所说,应该是未定义行为

转换指针类型没问题,只要不访问就行。(但不访问,转了也没用。可认为不能转)

比如:

float a = 1.0;
long * b = (long *)&a;

*b = 1;
return a;

按照标准,编译器可认为,a 未被修改(因为 *b 不是 a 的兼容类型,所以修改 *b 不应该污染 a),所以优化掉 b,直接返回 1.0。。。

无名啊 13楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,你看下 cppreference - 指针 - 注解 说的:

尽管任何指向对象的指针能被转型成指向其他类型对象的指针,解引用指向类型异于对象声明类型的指针几乎总是未定义行为。细节见严格别名使用。

无名啊 11楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,我比较怕的是未定义行为导致的结果错误,所以想弄清楚别名规则。

看到知乎那篇文章中的第三个例子,我又觉得 restrict 有助于减少性能损耗(修改 char * 导致编译器认为 this 可能被修改,进而没法重复利用缓存好的 this),所以顺便想弄清楚 restrict

无名啊 8楼回复 无名啊如何理解 C/C++ 中的 指针别名(pointer alias)、restrict、const 的关系呢? (2023-01-27//)

@老虎会游泳,回复好多啊,我刚看到第一条:

此外,Q_rsqrt()函数中没有未定义行为

未定义行为是:* ( long * ) &y

cppreference - 严格别名 说:

某左值表达式,是某个对象的[cvr修饰][有/无符号]兼容类型/含有第一项的结构体或联合体/字符类型,才能赋值访问,否则为未定义行为。

long 不是 float 的兼容类型,也不是字符类型,所以是未定义行为。

严重时,会产生结果错误/性能低下等后果(见 知乎 - 严格别名(Strict Aliasing)规则是什么? - 严格别名(strict aliasing)为什么讨厌 中的三个例子)

下一页 上一页 (21 / 31页)

12月17日 04:44 星期三

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1