gpt4 book ai didi

C vs C++ 将结构放在无符号字符缓冲区中

转载 作者:行者123 更新时间:2023-12-05 04:37:15 25 4
gpt4 key购买 nike

C 是否有类似于 C++ 的内容,可以像标准 sec. 6.7.2 中所示那样将结构放置在 unsigned char 缓冲区中,就像在 C++ 中所做的那样

template<typename ...T>
struct AlignedUnion {
alignas(T...) unsigned char data[max(sizeof(T)...)];
};
int f() {
AlignedUnion<int, char> au;
int *p = new (au.data) int; // OK, au.data provides storage
char *c = new (au.data) char(); // OK, ends lifetime of *p
char *d = new (au.data + 1) char();
return *c + *d; // OK
}

在 C 中,我当然可以将事物的结构(或如上所示的 int) memcpy 到一个无符号字符缓冲区中,但是随后使用指向该结构的指针会遇到严格的别名违规;缓冲区具有不同的声明类型。

所以假设有人想在 C 中复制上面的 C++ 中的第二行。有人会做这样的事情

#include<string.h>
#include<stdio.h>
struct Buffer {
unsigned char data[sizeof(int)];
};

int main()
{
struct Buffer b;
int n = 5;
int* p = memcpy(&b.data,&n,sizeof(int));
printf("%d",*p); // aliasing violation here as unsigned char is accessed as int
return 0;
}

通常建议使用 union ,即 union Buffer {int i;unsigned char b[sizeof(int)]}; 但如果缓冲区的目的是充当存储,这就不太好了(即,将不同大小的类型放在那里,通过将指针推进到缓冲区中的空闲部分 + 可能更多一些以便正确对齐)。

最佳答案

您是否尝试过使用union

#include <string.h>
#include <stdio.h>

union Buffer {
int int_;
double double_;
long double long_double_;
unsigned char data[1];
};

int main() {
union Buffer b;
int n = 5;
int *p = memcpy(&b.data, &n, sizeof(int));
printf("%d", *p); // aliasing violation here as unsigned char is accessed as int
return 0;
}

Buffer 根据对齐要求最高的类型来对齐data 成员。

关于C vs C++ 将结构放在无符号字符缓冲区中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70723528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com