繁体   English   中英

将指针 (int * 转换为 std::atomic<int> *)</int>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM