使用c++附加CORBA序列的简单方法



我正在使用omniORB和c++。

在我的应用程序中,我得到几个小的CORBA序列形成不同的模块,然后我需要将它们组合成一个大序列进行进一步处理。有简单的方法吗?比如seq2.append(seq1)seq2.push_back(seq1)。或者一些运营商?(我在stl方面真的是新手)。

我发现的唯一方法是手动遍历小序列的每个元素,并将其添加到大序列中。

//idl
struct Device;
typedef sequence<Device> DevicesList;
//c++
icore::DevicesList full_list;
foreach (const DStatusList &stlist, states_) {
    icore::DevicesList list = convertList(stlist);
    int newlength = full_list.length() + list.length();
    int last_index = full_list.length();
    full_list.length(newlength);
    int j=0;
    for(int i=last_index; i< last_index+list.length(); i++,j++) {
        full_list[i] = list[j];
    }
}

谢谢。

编写这样的小实用函数并不难。例如,您可以为CORBA序列创建自己的push_back:

template<class Seq, class T>
void push_back(Seq& seq, const T& item)
{
   const CORBA::ULong len = seq.length();
   seq.length(len + 1);
   seq[len] = item;
}
MySequence s;
push_back(s, 42);

请注意,一些ORB的序列类型不会在push_back上过度分配内存(就像std::vector那样),所以这可能会在每个push_back()调用上触发重新分配和复制。这可能是性能问题。您必须检查您的ORB是否这样做,可能是通过查看源代码来了解这是否是一个问题。不幸的是,我认为omniORB有这个问题;至少几年前是这样的。

缓解这种情况的一种方法是构造具有最大值的序列(如果你事先知道的话)。这将预先进行一个大的分配,然后您可以调用push_back()到该最大值,而不会触发重新分配:

MySequence s(100);   // construct with maximum; allocation happens here
push_back(s, 42);    // no reallocation
push_back(s, 0);     // no reallocation

我也同意stefaanv在评论中的建议。尽量少使用CORBA序列。基本上只在需要发出/接收CORBA调用的应用程序的"边缘"使用它。将数据放入标准容器中,以便于尽快对其进行操作。不要让CORBA类型"渗透"到您的应用程序中。如果您决定移植到非corba环境,这还有助于使您的应用程序更具可移植性。

我还听说有人提出了一个新的IDL到c++ 11的映射。这将IDL序列直接映射到std::vector,这将使事情变得相当容易。

相关内容

  • 没有找到相关文章

最新更新