【发布时间】:2016-04-01 03:01:10
【问题描述】:
上下文:
我有一块内存通过shm_open 在两个进程之间共享。我保证在ftruncateing 和mmaping 之后,整个块都有00000... 的位模式。我需要在两个进程之间共享一个布尔值。
一个更具体的问题:
在合理的 POSIX 系统上是否保证以下内容正常(断言不会失败并且 UB 不会发生)?
void *my_shared_memory_region = calloc(1024, 1);
bool *my_bool = reinterpret_cast<bool*>(my_shared_memory_region);
assert(*my_bool == false);
我认为bool 中的实际值存在一些限制,所以我不确定。我认为这个问题与this one 不同,因为reinterpret_cast 不会进行与C 样式转换相同的转换。
【问题讨论】:
-
从技术上讲,除了使用placement-new 创建新对象之外,在malloc 空间中执行任何操作都是C++ 中未定义的行为。我个人认为这更像是标准中的一个缺陷,并且希望您的代码能够正常工作。顺便说一句,你可以在这里使用
static_cast。 -
@M.M:哎呀,谢谢!
-
@M.M.:实际上,只要获得足够大小和正确对齐的存储空间,就存在一个简单初始化的对象(包括
bool)。也就是说,您必须考虑它包含一个不确定的值,直到您使用相同类型的左值写入它(严格的别名规则)。 -
@PatrickCollins:请注意,您在指针上使用
reinterpret_cast,而不是指向的数据。所以转换和演员风格不是问题。 -
为什么不使用
unsigned char?它似乎只是为了这样的事情而存在。
标签: c++ pointers casting boolean