鉴于我想对一些数据执行过滤,我如何才能避免在运行时生成这些数据,同时保持改变这些过滤器的大小和数据分布的灵 active ,同时保持漂亮干净的可重用代码。我知道我可以使用模板来执行如下操作:
template <int x> class Filter
{
static const float f;
static const Filter<x-1> next;
inline float* begin(const Filter<x>& el){ return &f; }
inline float* end(const Filter<x>& el) { return (&f)+x+1; }
};
template <> class Filter<0>
{
static const float f;
inline float* begin(const Filter<0>& el){ return &f; }
inline float* end(const Filter<0>& el) { return (&f)+1; }
};
template <int x> const float Filter<x>::f = someDistribution(x);
template <> const float Filter<0>::f = someDistribution(0);
这确实会根据 someDistribution(...) 根据过滤器对象中的索引 x 在我的过滤器中生成数据。然而,我的使用有一些缺点......
1) 我认为我说得对,虽然此数据不是在对象构造时生成的,但它是在程序启动时生成的。 - 这是我可以容忍的,尽管宁愿在 comiletime 计算过滤器并在那时和那里烘烤(这甚至可能用于 float 据吗?)
2) 过滤器不会实例化“下一个”成员,除非有一个遍历结构长度的成员函数(在某处被调用!),即
// inside template<int x> class Filter
inline void instantiate() const { next.instantiate(); };
// then inside template<> class Filter<0>
inline void instantiate() const { };
我一定是在要求 plunging 实例化函数时做错了,这使易于维护的子句失败了。
编辑:我关心这里的原因是我想确保实例化 next 成员,这样我就可以使用开始和结束函数遍历静态“数组”。
那么首先我该如何解决问题 2 并取消实例化函数,其次是否有可能解决问题 1 以便在编译时动态生成此数据并返回。
(注意我在类似问题上使用了 python 预编译脚本来生成包含过滤器数据的源文件,但我不想在这里使用它,因为那是它自己的鱼缸!)
最佳答案
因为你不能使用contexpr...关于你的问题:
除非您正在搜索下一个最大的质数,否则您不应该因为在启动时只进行一次简单计算而烦恼。尝试对其进行测量,您可能会发现初始化在不到一毫秒的时间内完成。
也就是说,在启动时计算的值表现为变量(每次使用时都必须询问它们的值),而编译时常量的值始终是已知的。因此前者可能会慢一点,但可能没有任何意义。
在造成不便之前始终先进行测量。
再一次,你为什么关心?如果代码中的任何地方都没有使用特定 x 的 Filter 类型,为什么该值应该在某处附近?
如果模板静态相互依赖,它们就会有问题 - 在您的情况下,它们不会相互依赖,每个 f 都是自治的。
综上所述,一个很好的修补工具是 http://gcc.godbolt.org/ - 您会在键入时看到程序集。它不支持 MS 编译器,但它可以让您很好地猜测编译器如何优化内容。
如果你的分配足够简单,可以成为一个宏,它将是一个编译时常量:
#define someDistribution(x) x * x
template <int x> struct Filter
{
static const float f;
};
template <int x> const float Filter<x>::f = someDistribution(x);
int main()
{
return Filter<200>::f + Filter<100>::f;
}
程序集(Clang):
main: # @main
movl $50000, %eax # imm = 0xC350
ret
如果您将 someDistribution 更改为函数,即使是内联函数,您也会发现必须进行计算。
编辑:请记住,您可以使用宏做任何事情,包括为某些值“专门化”它们。简单的分发应该是预处理器友好的。
关于c++ - 如何在编译时静态生成 float 据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19729966/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"