Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;干净指针算法 < C++中指针运算最干净的方法是什么?我正在尝试向地址添加n字节 int *foo; foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T)) int*foo; foo=静态施法(静态施法(foo)+sizeof(T))_C++_Linux_Pointers - Fatal编程技术网

C++;干净指针算法 < C++中指针运算最干净的方法是什么?我正在尝试向地址添加n字节 int *foo; foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T)) int*foo; foo=静态施法(静态施法(foo)+sizeof(T))

C++;干净指针算法 < C++中指针运算最干净的方法是什么?我正在尝试向地址添加n字节 int *foo; foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T)) int*foo; foo=静态施法(静态施法(foo)+sizeof(T)),c++,linux,pointers,C++,Linux,Pointers,稍后,您可以以不同的方式重铸和使用foo char* somestr = reinterpret_cast<char*>(foo) char*somestr=reinterpret\u cast(foo) 这够好吗?现在我了解到指针实现并不保证所有指针(char*,int*)都以相同的大小实现。因此,不确定int*(应该是foo*)和在数学中使用无符号int是否是最干净的解决方案。此外,它必须同时在32位和64位上工作 不管我为什么要这样做。但这并不是那么不寻常。每当您使用动态解

稍后,您可以以不同的方式重铸和使用foo

char* somestr = reinterpret_cast<char*>(foo)
char*somestr=reinterpret\u cast(foo)
这够好吗?现在我了解到指针实现并不保证所有指针(
char*
int*
)都以相同的大小实现。因此,不确定
int*
(应该是
foo*
)和在数学中使用无符号int是否是最干净的解决方案。此外,它必须同时在32位和64位上工作


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

最干净的指针算法不是通过字节数,而是通过强类型。不要将
int
数组视为其他对象,只需直接偏移:

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*foo\u buffer=reinterpret\u cast(foo);
char*whatever=foo_buffer+n;
除了
char
之外,您还可以使用
unsigned char
,它可以更合理地表示字节,但对指针算法没有影响。但是,请注意对齐:您不能再使用原始类型可靠地访问递增指针。访问未对齐的内存是严格未定义的行为(=不好!)。在最好的情况下,速度很慢。在最坏的情况下,它崩溃了


不言而喻,所有这些都是极低的水平。这样的代码几乎没有任何用处了。对于这种代码,即使是低级库也应该更喜欢使用C++标准库工具,指针算法的使用越来越少。

< P>指针运算最干净的方法不是字节数,而是强类型。不要将
int
数组视为其他对象,只需直接偏移:

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*foo\u buffer=reinterpret\u cast(foo);
char*whatever=foo_buffer+n;
除了
char
之外,您还可以使用
unsigned char
,它可以更合理地表示字节,但对指针算法没有影响。但是,请注意对齐:您不能再使用原始类型可靠地访问递增指针。访问未对齐的内存是严格未定义的行为(=不好!)。在最好的情况下,速度很慢。在最坏的情况下,它崩溃了


不言而喻,所有这些都是极低的水平。这样的代码几乎没有任何用处了。对于这种代码,即使是低级库也应该更倾向于使用C++标准库工具,指针算法的使用越来越少。

< p>您从一个指针转换到int,它可能会失败,尤其是如果int类型的大小与指针类型的大小不同。p> 如果要执行指针算术,请使用指针:

foo = reinterpret_cast <int *> (reinterpret_cast <T *> (foo) + 1);
foo=reinterpret\u cast(reinterpret\u cast(foo)+1);
请注意,使用了reinterpret_cast而不是静态_cast


更重要的是,这有一点代码味道-您想在这里实现什么?

您正在从指针转换到int,这可能会失败,特别是当int类型的大小与指针类型的大小不同时

如果要执行指针算术,请使用指针:

foo = reinterpret_cast <int *> (reinterpret_cast <T *> (foo) + 1);
foo=reinterpret\u cast(reinterpret\u cast(foo)+1);
请注意,使用了reinterpret_cast而不是静态_cast


更重要的是,这有点代码味道-您在这里试图实现什么?

您在这里所做的不是绝对错误就是不太容易理解。。。我建议您使用RTM:在这个时代,您应该发现执行指针运算的合法案例非常少。我不知道你想解决什么,但你可能不需要它。你在这里做的不是绝对错误就是不太容易理解。。。我建议您使用RTM:在这个时代,您应该发现执行指针运算的合法案例非常少。我不知道你想解决什么问题,但你可能不需要它。你的前两个代码片段与问题不完全一样,foo是一个
int*
。一定要使用
char*
进行缓冲区管理。@Skizz老实说,我不确定问了什么,但在问题中
foo
也被声明为
int*
,如果我们假设代码是有意义的,那么
T
必须是
int
,因此,代码有效地进行了数组索引。我认为您没有抓住要点。foo*指向任意内存位置(由应用程序重新解释)。我认为char*不是一个好主意,因为(我被告知)指针实现不需要统一。所以我想知道void*是否是储存foo最安全的选择。感谢您的回答。@excalibur您被告知错误(或被误解),而该陈述毫无意义<任意内存位置的代码>int*是