如果我知道data
的大小,我可以从vvp.at(0)
在第19行构建vf
。
#include <iostream>
#include <vector>
typedef void* VoidPointer;
typedef std::vector< float > VF;
typedef std::vector< VoidPointer > VVP;
int main(int argc, char** argv)
{
VF vf;
vf.push_back(13.0f);
vf.push_back(14.0f);
vf.push_back(15.0f);
vf.push_back(16.0f);
VVP vvp;
vvp.push_back( (VoidPointer)const_cast<float *>( &(vf.front()) ) );
VF data ( static_cast< float* >( vvp.at(0) ),
static_cast< float* >( vvp.at(0) ) + vf.size() );
std::cout << "data.size() is " << data.size() << std::endl;
for(VF::const_iterator i = data.begin(); i != data.end(); ++i)
{
std::cout << "data contains " << *i << std::endl;
}
return 0;
}
撇开这是否合情合理(示例是人为的)我想知道如果我不知道vvp.at(0)
的大小,如何将std::vector<float>
投射到vf
。我正在考虑类似的事情:
std::vector<float> data( *static_cast< std::vector<float>* >( vvp.at(0) ) );
但是这导致程序终止于std :: bad_alloc,如果需要,我不介意复制。
答案 0 :(得分:3)
这不是从vvp.at(0)
到向量的强制转换,它是 new 中浮动数组的副本向量。你不能在不知道长度的情况下复制它。您只保存了指向第一个元素的指针,因此信息丢失了。
您可以std::vector<std::pair<VoidPointer, size_t> > VVP
并保存&vf.front()
和 vf.size()
(如果您愿意,也可以保存开始和结束指针)。
你可以制作std::vector<VF *>
并存储指向矢量的指针(即vvp.push_back(&vf)
),现在根本没有投射。
编辑:如果您没有意识到:指针&vf
与&vf.front()
无关。 vf
是一个包含指针&vf.front()
(或获取它的方法)的结构。地址&vf.front()
中没有任何信息可让您找到&vf
。
答案 1 :(得分:1)
我唯一能想到的是极不便携(同样疯狂)。每个向量分配一个连续的内存数组。任何分配函数都必须跟踪已经分配了多少字节,这样它只能在分配地址的开头给它们解除分配。
AFAIK,C ++标准没有规定如何保存这本书,因此,这取决于每个编译器。一种方法是在实际分配地址之前写一个计数 - 我相信这是Visual C ++编译器的功能。 (例如,如果在0x104分配,则32位计数可以存储在0x100)。同样,您必须知道您的特定编译器如何保留本书。
无论如何,关键是,一旦你做了,一个小指针算术和解引用理论上可以查找分配的大小(我当然假设你仍然在这里使用带有默认分配器的向量),并且计算出仅使用void指针实际分配了多少个浮点数。
这是一个在32位调试模式下在Visual Studio中运行的示例:
#include <iostream>
#include <vector>
size_t bytes_allocated( void* p )
{
#ifndef _DEBUG
#error Doesn't work
#endif // _DEBUG
size_t const offset = 12;
size_t const counter_size = 4;
size_t const total_offset = offset + counter_size;
void* counter_address = ((char*)p)-total_offset;
size_t* count = reinterpret_cast<size_t*>(counter_address);
return *count;
}
int main(int argc, char* argv[])
{
typedef float test_type;
std::vector<test_type> v;
v.push_back(23);
v.push_back(23);
v.push_back(23);
size_t count = bytes_allocated(&v[0]);
std::cout<<count<<" bytes allocated\n";
std::cout<<count/sizeof(test_type)<<" items allocated\n";
return 0;
}
输出结果为:
12 bytes allocated
3 items allocated