gpt4 book ai didi

c++ - 此代码合法/可移植吗?访问结构之外的数据

转载 作者:行者123 更新时间:2023-11-27 23:25:51 25 4
gpt4 key购买 nike

基于评论和 answer on my other question我想出了这段代码。根据 5.3.4 New [expr.new] 的评论,只要它被分配,它就可以在结构之外访问。但是我找不到这样说的部分。

我想出了这段代码。我想知道它是否便携、完全定义和合法。输出有点有趣。 in gcc它是 10,10,12 而 visual studios 2010 显示 12,10,12。

代码在 C++11 或 C++03 中合法吗?我相信代码将在任何平台/CPU 中与标准编译器保持一致。

-edit- 如果你的懒惰的 flex_struct 是做有问题的事情的部分。

#include <iostream>
#include <new>
#include <cstring>

using namespace std;

template <typename STRUCT, typename TYPE> class flex_struct {
flex_struct(){}
public:
//should be safe to access and check what length the array is
static STRUCT* head(char*buff) {
//is this next line wrong?
//if((alignof(STRUCT)%reinterpret_cast<size_t>(buff))!=0) { throw std::exception(); }
return reinterpret_cast<STRUCT*>(buff);
}

struct struct_with_array : public STRUCT { TYPE buf[1]; };

TYPE* buff() {
//if(length==0) { throw std::exception(); }
auto p = reinterpret_cast<struct_with_array*>(this);
return p->buf;
}
};

typedef short testtype;

struct MyVariableLengthStruct : public flex_struct<MyVariableLengthStruct, testtype> {
int a, b;
char c;
};

struct MyVariableLengthStruct2 {
int a, b;
char c;
testtype buf[1];
};
struct MyVariableLengthStruct3a {
int a, b;
char c;
};
struct MyVariableLengthStruct3 : MyVariableLengthStruct3a {
testtype buf[1];
};
int main() {

auto srcarray=new char[1024];
//we don't actually need this line which is incorrect anyways (sizeof isnt 1024)
//memset(srcarray, 0, sizeof(srcarray)); //whats a C++ way to do this w/o writing a loop or function?
auto v = MyVariableLengthStruct::head(srcarray);
auto buff = v->buff();
auto dif1 = (int)buff-(int)v;
printf("%X %X %d\n", v, buff, dif1);
MyVariableLengthStruct2 v2;
auto dif2 = (int)v2.buf-(int)&v2;
printf("%X %X %d\n", &v2, v2.buf, dif2);
MyVariableLengthStruct3 v3;
auto dif3 = (int)v3.buf-(int)&v3;
printf("%X %X %d\n", &v3, v3.buf, dif3);
}

最佳答案

我看到这段代码有很多问题。

    //is this next line wrong?
//if((alignof(STRUCT)%reinterpret_cast<size_t>(buff))!=0) { throw std::exception(); }
return reinterpret_cast<STRUCT*>(buff);

new char[n] 返回的内存对于请求大小或更小的对象正确对齐。然而,静态和自动char数组不是。所以,如果你总是传递分配给 new char[n] 的东西在这里,没有问题。如果将指针传递给静态或自动数组,那么对齐确实是个问题。

struct struct_with_array : public STRUCT { TYPE buf[1]; };

超出数组边界的索引是未定义的行为。 buf只有一个元素你可以访问。请注意,原始答案中的代码不会发生此问题。

auto p = reinterpret_cast<struct_with_array*>(this);

我不完全确定这个转换的有效性,但我怀疑它打破了严格的别名。

auto srcarray=new char[1024];
memset(srcarray, 0, sizeof(srcarray)); //whats a C++ way to do this w/o writing a loop or function?

C++ 方式是 std::vector<char>(1024); , 我猜。无论如何sizeof(srcarray)可能不是 1024,但可能是 4 或 8(等于 sizeof(char*) )。

auto v = MyVariableLengthStruct::head(srcarray);

从来没有 MyVariableLengthStructsrcarray 指向的内存中构建,因此这仅适用于 POD 类型。

关于c++ - 此代码合法/可移植吗?访问结构之外的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9584641/

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