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 ++格式。谢谢
答案 0 :(得分: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{});
答案 1 :(得分:4)
调用standard library function malloc()
来分配sizeof (struct forcePin)
字节的动态(“堆”)内存。
然后pointlessly casting the returned pointer,并将其存储在变量_forcePin[i]
。
这不是编写此代码的最佳方式,在我看来应该是:
_forcePin[i] = malloc(sizeof *_forcePin[i]);
请注意,如果分配是从循环中断开的(如i
所暗示的那样),那么该代码看起来像是在分配512 * 500,000个字节,或者大约244 MB的内存。由于它完成了50万次分配调用,因此也会产生相当大的开销。
如果真的需要所有内存,最好尝试单个malloc()
调用,然后将分配的缓冲区拆分为500,000个部分。这样做很可能会更快,因为malloc()
可能很昂贵而且有50万次调用很多,但它肯定会节省内存,因为会有一个开销成本而不是500,000。
答案 2 :(得分: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());
答案 3 :(得分:1)
这一行是你的通用C风格内存分配:
malloc
(forcePin
)所需的确切字节数分配内存(sizeof(struct forcePin)
)。 malloc
的返回值是指向新分配的内存的void指针(void *
),将其强制转换为指向forcePin
结构((struct forcePin *)
)的指针< / LI>
醇>
C ++版本类似于:
_forcePin[i] = new forcePin;
struct
关键字)delete _forcePin[i]
因为看起来您可能想要创建所有500000 forcePin
,所以您可以一步完成:
forcePin _forcePins = new forcePin[500000];
答案 4 :(得分:0)
您询问的行分配一块内存(请参阅malloc()
),并将其地址存储在_forcePin
数组中,索引为i
。
在C ++中,您可以使用new
,即:_forcePin[i] = new forcePin