[英]Casting Pointers (int * to std::atomic<int>*)
首先感谢所有让这个论坛对开发人员如此有用的人。
我离开 C/C++ 编程已有一段时间了,现在我正努力跟上最新的步伐。 在审查代码时,我遇到了这个:
volatile int* obj
const volatile std::atomic<int>* ptr_a = (const volatile std::atomic<int>*)obj;
我发现int *
到std::atomic<int>*
的转换很引人注目,我不太清楚这是否真的正确,为什么,当然在编译时它是有效的,但它们指向的类型不同,虽然原子 class 重载了 = 和 T 运算符,在这种情况下我看不出这有什么关系。
也许我只是忽略了一些基本的东西。
提前感谢任何可以给我一些相关信息的人。
编辑:
我在 Dar.net 框架的 http_stream.cpp 文件(第 713 行)中看到了这种转换:
https://github.com/AlexeyAB/dar.net/blob/master/src/http_stream.cpp
这是无意义的 C++ 代码。 使用ptr_a
几乎肯定会产生未定义的行为。
只有当obj
实际上是指向const volatile atomic<int>
的指针时,它才不是 UB。 也就是说,如果有人为obj
分配了如下代码:
obj = reinterpret_cast<const volatile int*>(new const volatile atomic<int>());
但是然后尝试在没有强制转换的情况下访问obj
将是 UB。
我的猜测是有人使用了 C++11 之前的技巧,即使用volatile
表示“原子”。 然后其他人想使用有效的 C++11 代码,但他们不想更改所有其他代码(可能需要与 C 兼容,但有更好的方法可以实现)。 所以他们做了这个 hackery,他们的编译器并没有因此惩罚他们。
就C++来说还是废话。 事实上,人们应该怀疑地看待任何涉及volatile
的“原子”代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.