首页 \ 问答 \ STL向量中隐藏的副本?(hidden copy in STL vector?)

STL向量中隐藏的副本?(hidden copy in STL vector?)

使用带类的向量时,我遇到意外的性能下降。

我有一个csv_File类,它读入一个csv文件并将内容存储在一个2D向量中。 有一个允许访问的成员函数,例如

    csv_File file("file.csv");
    file.access(2,2);

访问2,2元素。

然后,我有另一个类csv_Array,它在向量中存储多个csv_File对象,例如私有成员向量有一个允许访问的成员函数,即它返回一个csv_File对象,例如:

    csv_Array file_array(5); //store 5 csv_File objects
    file_array.grab(0).access(2,2); 

在第二行中,grab返回一个csv_File对象(在本例中是第一个),access是csv_File对象的成员函数。

但是,我注意到调用csv_Array.grab(0).access(2,2); 比它应该慢得多(它应该只是3个vector :: at calls)。

是否有某种隐藏的副本正在使这个非常慢?

编辑:以下是一些相关的函数原型:

    //Access in csv_File
    std::string access(int row, int column);

    //grab in csv_Array and csv_Analysis (mentioned below)
    csv_File grab(int index);

附加详细信息(如有必要):此代码的应用是将一堆csv文件加载到内存中,然后将其传递给将对数据进行一些计算的朋友类。 原理上,我有以下内容:

1)csv_Array具有私有成员向量存储; 2)csv_Analysis是一个csv_Array的朋友的类3)csv_Analysis访问矢量存储,它位于csv_Array中4)这种访问是通过将csv_Analysis传递给csv_Array中的存储(因此没有希望复制....)来完成的,例如public:csv_Analysis(csv_Array&csv_block);

因此,上面给出的调用[file_array.grab(0).access(2,2); ]实际上还有一个额外的“级别”,更像是

    csv_Analysis analysis_Object(file_array); 
    analysis_Object.grab(0).access(2,2); 

其中grab以相同的方式起作用,并且也被定义为csv_Analysis类的成员函数。


I am experiencing unexpected performance degradation when using vectors with classes.

I have a csv_File class that reads in a csv file and stores the contents in a 2D vector. There's a member function that allows access, e.g.

    csv_File file("file.csv");
    file.access(2,2);

To access the 2,2 element.

Then, I have another class csv_Array that stores multiple csv_File objects in a vector, e.g private member vector There's a member function that allows access, i.e. it returns a csv_File object, for example:

    csv_Array file_array(5); //store 5 csv_File objects
    file_array.grab(0).access(2,2); 

In the second line, grab returns a csv_File object (in this case, the first one) and access is a member function of the csv_File object.

However, I have noticed that the call csv_Array.grab(0).access(2,2); is much slower than it should be (it should be just 3 vector::at calls).

Is there some sort of hidden copy going on that is making this very slow?

EDIT: Here are some of the relevant function prototypes:

    //Access in csv_File
    std::string access(int row, int column);

    //grab in csv_Array and csv_Analysis (mentioned below)
    csv_File grab(int index);

ADDITIONAL DETAILS (if necessary): The application of this code is to load a bunch of csv files into memory before passing it to a friend class that will do some calculations with the data. Schematically, I have the following:

1) csv_Array has private member vector storage; 2) csv_Analysis is a class that is a friend of csv_Array 3) csv_Analysis accesses vector storage, which is in csv_Array 4) This access is done by passing csv_Analysis a reference to storage in csv_Array (so no copy hopefully....), e.g public: csv_Analysis(csv_Array &csv_block);

Thus, the call given above[file_array.grab(0).access(2,2); ] actually has one additional class "level" in between and is more like

    csv_Analysis analysis_Object(file_array); 
    analysis_Object.grab(0).access(2,2); 

where grab acts in the same way, and is also defined as a member function of csv_Analysis class.


原文:https://stackoverflow.com/questions/6514438
更新时间:2023-08-22 16:08

最满意答案

如果你愿意,你可以使用字符串进行记录,以“包裹”你的实际信号。 这是一个小小的问题,但我很难想到另一种方式,没有头脑伤害魔法的文件在VHDL中更糟糕。 所以:

type stdWithName is
     record
         name : String;
         value : std_logic;
end record;

然后你可以初始化它:

signal val : std_logic := '0';
signal withName : stdWithName := ("withName",val);

并比较名称

if (withName.name = "withName") then
      -- huzzah! a match. 
end if;

If you wanted, you could make a record with strings to 'wrap' around your actual signal. This is a little kludgey, but it is hard for me to think of another way, short of head-hurting magic with files that would be even worse in VHDL. So:

type stdWithName is
     record
         name : String;
         value : std_logic;
end record;

you could then initialize this like:

signal val : std_logic := '0';
signal withName : stdWithName := ("withName",val);

and compare the name like

if (withName.name = "withName") then
      -- huzzah! a match. 
end if;

相关问答

更多

相关文章

更多
  • 《数据结构与STL》(Data Structures and the Standard Template Library)扫描版[PDF]
  • HDFS的副本存放策略
  • Java 数据结构
  • Java 集合框架
  • HDFS的副本存放策略——ReplicationTargetChooser
  • android隐藏了错误!
  • Android 使用隐藏API 开发应用程序
  • ElasticSearch入门- 设置分片副本数量及putMapping
  • HDFS读取副本的选择策略
  • Android EditText软键盘显示隐藏以及“监听”
  • 最新问答

    更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)