2

如果我data知道.vvp.at(0)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 终止,如果需要,我不介意复制。

4

2 回答 2

3

这不是从到向量的转换,而是将浮点数组复制向量中。而且你不能在不知道长度的情况下复制它。您只保存了指向第一个元素的指针,因此信息丢失了。vvp.at(0)

您可以std::vector<std::pair<VoidPointer, size_t> > VVP同时创建和保存&vf.front() and vf.size()(或者如果您愿意,可以创建和保存开始和结束指针)。

您可以创建std::vector<VF *>和存储指向向量(即vvp.push_back(&vf))的指针,现在根本没有强制转换。

编辑:如果您没有意识到:指针&vf&vf.front(). vf是一个包含指针&vf.front()(或获取它的方法)的结构。仅地址中没有任何信息&vf.front()可以让您找到&vf

于 2012-11-14T01:42:01.447 回答
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
于 2012-11-14T01:53:13.567 回答