"struct hack"可以这样实现吗?
Can "struct hack" be implemented this way?
Struck hack用于分配比结构本身初始需要更多的内存,以便您可以引用数组的越界部分,这样您就可以留在实际分配的内存中。
这是它的工作原理。
struct Foo
{
// ..
size_t size;
int data[1];
};
const size_t SIZE = 100;
Foo *p = (Foo*) malloc(sizeof(Foo) + sizeof(int) * (SIZE - 1));
p->size = SIZE;
for (int i = 0; i < p->size; ++i) (p->data)[i] = i;
问题:
我们可以使用单个整数而不是大小为1的数组吗?如果这是可行的,那么为什么数组大小为1的版本变得更受欢迎呢?
struct Foo
{
// ..
size_t size;
int data;
};
// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;
在数组的边界之外访问数组是未定义的行为。例如,调试器可能决定在数组的每一边插入金丝雀数组。
明智的做法是使用std::vector
,这就是它的作用。
对于第二个版本,您无法使用美观的直接数组语法。你不能做
p->data[i]
,但必须做
(&p->data)[i]
因为写p->data[i]
比写(&p->data)[i]
更方便。
因为p->data[i]
比(&p->data)[i]
更短更易读
相关文章:
- 如果没有malloc,链表实现将失败
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 栈使用Struct或Class来实现其私有数据
- "struct hack"可以这样实现吗?