gpt4 book ai didi

C++ 干净指针算法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:35 25 4
gpt4 key购买 nike

在 C++ 中执行指针运算的最干净的方法是什么?我正在尝试将 n 个字节添加到一个地址。

int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))

稍后您可以重新转换并以不同的方式使用 foo

char* somestr = reinterpret_cast<char*>(foo)

这够好吗?现在我明白了指针实现 dosent 保证所有指针(char*int*)都以相同的大小实现。所以不确定 int*(应该是 foo*)和使用 unsigned int 进行数学计算是否是最干净的解决方案。此外,它必须同时适用于 32 位和 64 位。

别管我为什么要这样做。不过,这并不是那么不寻常。每当您使用动态解释为不同类型的数据流(或字节池)时,您都会遇到这个问题。

最佳答案

进行指针运算的最简洁的方法不是通过字节数,而是强类型。不要将 int 数组当作其他东西,直接偏移即可:

int* next = foo + n;

或:

int* next = &foo[n];

两者都优于您的类型转换解决方案。

在处理字节缓冲区的情况下,请使用 char*,而不是(永远不要!)int*。也就是说,

char* buffer = get_the_buffer();

// Pointer arithmetic uses sizeof(char) == 1

如果你真的需要在非字节数组中按字节递增,首先问问自己为什么要这样做。然后,转换为 char* 并进行指针运算;不要转换为int 或其他整数类型:

char* foo_buffer = reinterpret_cast<char*>(foo);
char* whatever = foo_buffer + n;

除了 char,您还可以使用 unsigned char,这可以说更适合表示字节,但对指针运算没有影响。但是要小心对齐:您不能再使用原始类型可靠地访问递增的指针。访问未对齐的内存是严格未定义的行为(= !)。在最好的情况下,它很慢。在最坏的情况下,它会崩溃。

不用说,所有这些都是极低水平。这样的代码几乎没有用处了。对于这种代码,即使是低级库也应该更喜欢使用 C++ 标准库设施,尤其是指针算法的使用越来越少。

关于C++ 干净指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621646/

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