当然,我想知道一些神奇的解决方法,但我对重组持开放态度。
所以我有一个类DeviceDependent , 具有以下构造函数
DeviceDependent(Device& device);
它存储对设备的引用。该设备可以更改状态,这将需要更改所有 DeviceDependent依赖于该设备的实例。 (你猜对了,这是我尝试驾驭 directX 野兽的微不足道的尝试)
为了处理这个,我有函数 DeviceDependent::createDeviceResources() , DeviceDependent::onDeviceLost() .
我计划注册每个 DeviceDependent实例到 DeviceDependent 中指定的设备构造函数。该设备将保留一个 std::vector<DeviceDependent*>所有DeviceDependent如此注册的实例。然后它会遍历该 vector 并在适当的时候调用上述函数。
这看起来很简单,但我特别喜欢的是我可以有一个 std::vector<DeviceDependent (or child)>代码中的其他地方并快速迭代它们。例如我有一个类 Renderable顾名思义,它代表一个可渲染对象,我需要至少在一帧上迭代一次,因此我不希望对象分散在整个内存中。
言归正传,问题来了:
当我创建实体对象时,我依赖于 move 语义。这纯粹是出于本能,我没有考虑复制像这样的大对象以将它们添加到 std::vector<DeviceDependent (or child)>收藏。 (并且仍然厌恶这个想法)
然而,随着 move 语义(我已经为那些不相信它的人测试了这一点),对象的地址发生了变化。更重要的是在调用默认构造函数后它会发生变化。这意味着我的代码在 DeviceDependant 的构造函数中打电话device.registerDeviceDependent(this)编译并运行良好,但设备会累积一个指针列表,一旦对象移入 vector ,这些指针就会失效。
我想知道我是否可以坚持这个计划并让它发挥作用。
我想到的事情:
使“真实” vector 成为共享指针的集合,复制没有问题。该对象大概不会更改地址。我不喜欢这个计划,因为我担心将东西留在堆上会损害迭代性能。
在 move 对象后调用 register,这是我临时做的事情,但我不喜欢它,因为我觉得构造函数是执行此操作的合适位置。那里
不应存在 DeviceDependent 的实例这不在某些设备的 list 上。
编写自己的 move 构造函数或 move 赋值函数。这样我就可以从设备中删除旧地址并将其更改为新地址。我不想这样做,因为我不想随着类(class)的发展而不断更新它。
最佳答案
这与 move 构造函数无关。问题是 std::vector。当您向该 vector 添加新项目时,它可能会重新分配其内存,这将导致所有 DeviceDependant 对象都被转移到 vector 内部的新内存块。然后将构建每个项目的新版本,并删除旧版本。构造是复制构造还是 move 构造是无关紧要的;无论哪种方式,对象都会有效地改变它们的地址。
为了使您的代码正确,DeviceDependant 对象需要在其析构函数中注销自己,并在复制构造函数和 move 构造函数中注册自己。如果您还没有删除那些构造函数,那么无论您对存储做出什么其他决定,您都应该这样做。否则,如果调用这些构造函数,将会做错事。
一种不在您的列表中的方法是通过使用您将存储的最大项目数调用 reserve() 来防止 vector 重新分配。这仅在您知道 DeviceDependant 对象数量的合理上限时才实用。但是,您可能会发现,保留一个估计值,虽然不会完全消除 vector 重新分配,但这种情况很少见,以至于取消注册和重新注册的成本变得微不足道。
听起来您的目标是为 DeviceDependants 获得缓存一致性。您可能会发现使用 std::deque 作为主存储可以避免重新分配,同时仍然提供足够的缓存一致性。或者您可以通过编写自定义分配器或运算符 new() 来获得缓存一致性。
顺便说一句,听起来您的设计是由您只是猜测的性能成本驱动的。如果你实际测量它,你可能会发现使用 std::vector> 很好,并且不会显着地迭代它们所花费的时间。 (请注意,您在这里不需要共享指针,因为 vector 是唯一的所有者,因此您可以避免引用计数的开销。)
关于c++ - move 语义、标准集合和构造时间地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17376893/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时