-3
struct forcePin {
    char _name[512];
};

struct forcePin *_forcePin[500000];    
_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

我可以知道如下所示的行在做什么吗?

_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

我对c不熟悉,如果你能告诉我如何使这一行也成为C++格式。谢谢

4

5 回答 5

7

动态内存分配在 C 语言中非常重要,您应该真正正确地学习它。

有问题的行所做的是从堆中分配内存,即sizeof(struct forcePin)字节。该malloc函数返回一个指向该分配内存的通用指针,并将该指针分配给指针_forcePin[i]

关于该行的一件事,您不应该malloc函数的返回值进行类型转换。


在 C++ 中,您使用以下new语句来分配指针:

_forcePin[i] = new forcePin;

但是,不鼓励在 C++ 中使用指针和动态堆分配。相反,我建议您使用std::vector非指针结构:

struct forcePin {
    std::string name;
};

std::vector<forcePin> forcePin;
forcePin.push_back(forcePin{});
于 2013-07-10T08:23:48.897 回答
4

它调用标准库函数malloc(),分配sizeof (struct forcePin)动态(“堆”)内存字节。

然后它毫无意义地转换返回的指针,并将其存储在变量中_forcePin[i]

这不是编写此代码的最佳方式,在我看来它应该是:

_forcePin[i] = malloc(sizeof *_forcePin[i]);

请注意,如果分配是在循环中中断的(正如i暗示的那样),那么该代码看起来像是分配了 512 * 500,000 字节,或大约 244 MB 的内存。由于它是在 50 万次分配调用中完成的,因此也会有相当大的开销。

如果确实需要所有内存,最好尝试一次malloc()调用,然后将分配的缓冲区拆分为 500,000 个部分。这样做很可能会更快,因为可能会很malloc()昂贵,而且一百万次调用很多,但它肯定会节省内存,因为会有一个间接成本而不是 500,000。

于 2013-07-10T08:23:56.237 回答
1
_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

分配一个大小为 的内存块forcePin,并将分配的内存从 ( void *) 转换为forcePin类型。在 C++ 中,你会这样做:

_forcePin[i] = new forcePin();

或者更好的是,您可以拥有:

std::vector<forcePin> vec;
vec.push_back(forcePin());
于 2013-07-10T08:25:17.377 回答
1

此行是您的通用 C 样式内存分配:

  1. malloc为结构forcePin( ) 所需的确切字节数分配内存 ( sizeof(struct forcePin))。
  2. 由于 的返回值malloc是一个指向新分配内存的 void 指针 ( void *),因此将其转换为指向forcePin结构 ( (struct forcePin *))的指针

C++ 版本将类似于:

_forcePin[i] = new forcePin;
  • 在 C++ 中,struct引用结构类型时不需要关键字)
  • 不要忘记在不需要时释放内存delete _forcePin[i]

因为看起来您可能只想创建所有 500000 forcePins,所以您可以一步完成:

forcePin _forcePins = new forcePin[500000];
于 2013-07-10T08:33:54.493 回答
0

您询问的有关分配内存块的行(请参阅 参考资料malloc()),并将其地址存储到_forcePin数组中的 index 处i

在 C++ 中,您会使用new,即:_forcePin[i] = new forcePin

于 2013-07-10T08:24:47.227 回答