草庐IT

不变性

全部标签

c++ - 在元编程中强制执行不变量

我希望能够检查元程序中使用的类的不变量。我的第一个天真的方法是templatestructdigit{static_assert((N>=0)&&(N;但是编译没有任何问题。只有在构造非法类时才会触发静态断言。添加额外的模板参数时是可能的:#includetemplate=0)&&(N::type>structdigit;usingcrash=digit;当我想将此技术应用于用作类型列表的类时:#includetemplatestructare_integral;templatestructare_integral{staticconstboolvalue=std::is_integr

c - 使用 strtod strtof atof printf 进行语言环境不变的字符串处理?

是否有任何计划添加在当前语言环境下不变的C标准库字符串处理函数版本?目前有很多脆弱的解决方法,例如,来自jansson/strconv.c:staticvoidto_locale(strbuffer_t*strbuffer){constchar*point;char*pos;point=localeconv()->decimal_point;if(*point=='.'){/*Noconversionneeded*/return;}pos=strchr(strbuffer->value,'.');if(pos)*pos=*point;}staticvoidfrom_locale(cha

c++ - 我可以依靠编译器查找和优化简单的 bool 循环不变量吗?

我有一个类似于下面的循环,它有一个不变量,这里是scaleEveryValueByTwo的永不改变的值。我能否依靠编译器发现这个不变性而不在每次迭代中检查条件(基本上编译为类似于底部代码的东西)?voidloadValuesFromDisk(constboolscaleEveryValueByTwo){std::vectorxs;while(fileHasNewValues()){autox=loadNextValue();if(scaleEveryValueByTwo){x*=2;}xs.push_back(x);}}我当然可以手动将它分成两个循环(见下文)或将缩放部分放在一个单独的

单GPU就能压缩模型,性能不变参数少25%!微软提出模型稀疏化新方法

众所周知,对于大语言模型来说,规模越大,所需的算力越大,自然占用的资源也就越多。研究人员于是乎把目光转到了这片领域,即模型的稀疏化(Sparsification)。今天要介绍的SliceGPT,则可以实现模型的事后稀疏。也就是说,在一个模型训练完了以后再进行稀疏化操作。该模型由微软研究院和苏黎世联邦理工学院联合发表在了arXiv上。目前主流的稀疏化技术面临着挺多挑战和困难。比方说,需要额外的数据结构,而且在当下的硬件条件下,速度有限。SliceGPT就能很好的解决这些问题——它能用一个较小的矩阵来替换每个权重矩阵,从而降低网络的嵌入维度。而实际结果也是非常不错的,在LLAMA-270B、OPT

c++ - 删除元素后 std::string 容量保持不变,那么它是否占用了一些内存?

下面这段代码:stringa="abc";cout...输出:33即使我从字符串中删除一些元素,容量也保持不变。所以我的问题是:是否有一些内存因为容量问题而被占用?如果我没有明确地reserve()怎么办?如果我使用reserve()并且没有用完整个容量,我是不是在浪费内存?如果需要,这些额外的内存(我没有使用)是否会分配给其他东西?编辑:假设我有stringa="something";a="ab";现在我知道a永远不会超过两个字符。那么调用reserve(2)这样内存就不会被浪费是明智的吗? 最佳答案 我先回答你的问题:内存属于字

c++ - 起源 - 不变的还是新的类型?

我正在编写一个Point类(在3d空间中)并且一直想知道创建原点的最佳方法是什么。这是基本类(取自Andy的示例,以防万一有人想知道基本实现是什么):structPoint{constexprPoint(doublex_,doubley_,doublez_):x(x_),y(y_),z(z_){}doublex;doubley;doublez;};获得原点的第一种方法是定义一个constexpr变量:constexprPointorigin={0.0,0.0,0.0};第二个是定义一个新类型和重载算法,如果它们在使用原点计算时可以从优化中受益(假设我为Point编写了一个constex

c++ - 为什么线程在终止而不分离时让它们的堆栈保持不变?

当您使用线程时,如果一个线程运行到终止状态,但没有分离,它就处于僵尸状态,等待通过连接收割或分离,以便清理其资源。我读到当线程成为僵尸时,有两个未清理的“资源”是堆栈和返回值。有人能告诉我允许堆栈持续存在直到进行连接的逻辑吗?如果返回值有一个单独的位置,我想不出一个很好的理由-但我确定有一个,我想在我使用线程时知道它。 最佳答案 保持堆栈存活的技术实现更容易。您的线程实现可以使用堆栈底部作为工作空间,甚至可以从调度程序中注销当前线程。之后,调用join()的线程的上下文可用于删除空间。如果您要在join()之前删除堆栈-也就是说,在

c++ - 递归搜索堆栈,但保持堆栈不变

我一直在尝试编写一个递归函数来搜索堆栈,但将堆栈保留在其原始状态。我可能会流脓h并弹出堆栈,但不使用辅助堆栈或任何其他数据结构。是的,这是家庭作业,所以我不希望得到完整的编码答案:)。关于如何处理堆栈以便在递归搜索完成后堆栈完好无损的一点帮助将不胜感激。下面给出了在堆栈中搜索指定项(但会销毁堆栈)的递归函数:templateTypegetNth(stack(Type)&s,intn){if(s.empty())return-1;if(s.top()==n)returns.top();if(s.top()!=n&&s.empty())return-1;elses.pop();return

c++ - 我可以期望我从文字常量设置的浮点变量值在分配给其他变量后不变吗?

如果我这样做:floata=1.5f;floatb=a;voidfunc(floatarg){if(arg==1.5f)printf("Youaretehawresome!");}func(b);文本是否每次(以及在每台机器上)打印?编辑我的意思是,即使我没有进行任何计算,我也不确定该值是否会在某个时候通过FPU,如果是这样,FPU是否会更改该值的二进制表示形式。我在某处读到,(近似)相同的浮点值在IEEE754中可以有多个二进制表示。 最佳答案 首先,1.5可以准确地存储在内存中,因此对于这个特定值,是的,它永远为真。更一般地说,

c++ - 哪种数据结构用于 C++ 中巨大但不变的字典

我必须使用带有整数(或枚举)键和字符串值的巨大字典。但这是完全不变的。无法在运行时更改。有没有办法(使用模板等)在编译时检索字典数据而不是使用现有的字典结构? 最佳答案 Clang和LLVM通过结合使用代码生成和预处理器技巧生成包含其对象的表来解决您的问题。您可以跳过任一步骤,具体取决于您自己的设置。例如://records.incEXPAND_RECORD(Foo,"Foo",4);EXPAND_RECORD(Bar,"Bar",18);EXPAND_RECORD(Bar2,"Bar",19);现在,您可以生成您的枚举://rec