小编Rak*_*esh的帖子

使用线程时的内存管理

1)我尝试搜索当我们在程序中使用线程但是找不到答案时如何分配内存.这里堆栈和堆的内容和位置是什么?是调用单个程序时堆栈和堆的工作方式.但是当涉及到线程编程时会发生什么?

2)使用OpenMP并行区域创建线程,并行代码将在每个线程中并发执行.这是否在内存中分配的空间比顺序执行的相同代码占用的内存多?

heap stack multithreading memory-management openmp

4
推荐指数
1
解决办法
3544
查看次数

将union字段中的位解释为C/C++中的不同数据类型

我试图访问Union位作为不同的数据类型.例如:

    typedef union {
    uint64_t x;
    uint32_t y[2];
    }test;

    test testdata;
    testdata.x = 0xa;
    printf("uint64_t: %016lx\nuint32_t: %08x %08x\n",testdata.x,testdata.y[0],testdata.y[1]);
    printf("Addresses:\nuint64_t: %016lx\nuint32_t: %p %p\n",&testdata.x,&testdata.y[0],&testdata.y[1]);
Run Code Online (Sandbox Code Playgroud)

输出是

uint64_t: 000000000000000a
uint32_t: 0000000a 00000000
Addresses:
uint64_t: 00007ffe09d594e0
uint32_t: 0x7ffe09d594e0 0x7ffe09d594e4
Run Code Online (Sandbox Code Playgroud)

指向的起始地址y与起始地址相同x.由于两个字段使用相同的位置,因此值不应该x00000000 0000000a

为什么不发生这种情况?内部转换如何在具有不同数据类型的不同字段的联盟中发生?

需要做什么来使用联合以与uint64_t中相同的顺序检索精确的原始位作为uint32_t?

编辑:如评论中所述,C++提供了未定义的行为.它在C中如何工作?我们真的可以这样做吗?

c c++ bit-manipulation unions

3
推荐指数
1
解决办法
151
查看次数