小编Bla*_*aws的帖子

防止gcc中的std :: function分配内存或增加阈值

有没有办法防止std::functiongcc为更大的函数对象动态分配内存?

我希望以下代码在没有动态分配的情况下工作:

#include <functional>
#include <iostream>

// replace operator new and delete to log allocations
void* operator new (std::size_t n) {
    std::cout << "Allocating " << n << " bytes" << std::endl;
    return malloc(n);
}
void operator delete(void* p) throw() {
    free(p);
}

  class TestPlate
  {
    private:
        int value;

    public:
        int getValue(){ return value; }
        void setValue(int newValue) { value = newValue; }

        int doStuff(const std::function<int()>& stuff) { return stuff(); }

  };

int main()
{
    TestPlate testor;
    testor.setValue(15); …
Run Code Online (Sandbox Code Playgroud)

c++ gcc memory-management c++11 std-function

6
推荐指数
1
解决办法
610
查看次数

通过参数推导多参数模板中的第一个模板参数

首先是我的问题,然后解释我正在尝试做什么,因为我可能会错误地处理问题。

是否可以在指定其他参数的同时从参数中推导出多参数模板中的第一个模板参数。

例子:

 template<class A, class B>
 B function(A object)
 { 
     return B(A);
 }
Run Code Online (Sandbox Code Playgroud)

称为:

 function<BType>(AInstance);
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法来完成这项工作。

编辑:另一个例子可能更适合我下面的问题,正如我收到的第一条评论所表明的那样

例子:

 template<class A, A::B foo>
 void function(A object)
 { 
     object.doSomethingWithTypeA::B(foo);
 }
Run Code Online (Sandbox Code Playgroud)

称为:

 function<A::BInstance>(AInstance);
Run Code Online (Sandbox Code Playgroud)

不同之处在于,第二个模板参数取决于第一个模板参数的具体类型,因此我无法切换模板参数。

现在描述我正在尝试做的事情:

我目前正在尝试创建一个模板通用仿函数类,它可以采用自由函数或成员函数并将其包装到仿函数中。

我成功地实现了我的目标,但现在我想让一切变得更加用户友好。目前创建函子的模板化函数如下所示:

template <class T, ReturnType (T::*Method)(FunctionArguments...)>
static constexpr UniversalFunctor Create(T* object) {
   return {object, MethodWrapper<T, Method>};
}
Run Code Online (Sandbox Code Playgroud)

现在要为用户必须调用的成员函数创建函子

UniversalFunctor<ReturnType>::Create<ClassName, ClassFunction>(Object)
Run Code Online (Sandbox Code Playgroud)

这是相当麻烦的。

由于 Object 必须是 ClassName 类型或者至少可以推导出来,我预计会出现这样的调用:

UniversalFunctor<ReturnType>::Create<ClassFunction>(Object)
Run Code Online (Sandbox Code Playgroud)

也应该能够成功,因为 ClassName 参数可以从传递的指针中推导出来。然而,这似乎不可能,因为 ClassFunction 始终被视为第一个模板参数。

c++ templates template-argument-deduction

5
推荐指数
1
解决办法
1850
查看次数

数值文字0.e0f是什么意思?

我目前正在尝试调试未初始化的内存错误.我现在遇到OpenBlas源代码中的数字文字0.e0f(这是调试器当前所在的)这是什么意思?

上下文是这样的:

if ((alpha_r == 0.e0f) && (alpha_i == 0.e0f)) return;
Run Code Online (Sandbox Code Playgroud)

0.e0f显然评估为0.

c literals openblas

2
推荐指数
1
解决办法
1127
查看次数

链接器通常是否优化了来自不同c ++模板实例的重复代码?

我已经用C++编程了很长一段时间,我很喜欢使用模板.由于我涉足嵌入式编程,我最近一直想知道的是,人们应该期望链接器在模板参数不同的模板实例中对代码重复行为.

对于具有相同参数的相同模板的多个实例,众所周知,在链接时间内将其优化掉(另请参阅:C++链接模板实例如何)

但是在我的情况下,我很感兴趣链接器是否会识别使用不同参数实例化的两个模板之间的任何重复代码.由于它们是不同的类型,我认为它们不会自动崩溃.然而,由于它们可能具有一些不依赖于模板参数的函数,因此在两个类之间是相同的,因此可以假设链接器可以优化这些函数并因此节省空间.

在这种情况下,预期的行为是什么?

c++ linker templates multiple-instances instance

2
推荐指数
1
解决办法
478
查看次数