小编Pla*_*men的帖子

如果A有析构函数,std :: unique_ptr <A>何时需要特殊的删除器?

如果类Aunique_ptr<A>它自己的析构函数,是否有必要宣布有删除,以确保唯一指针使用该析构函数?我想到的例子是A有一个mx类型的成员user_matrix(我刚刚编写的名称)需要调用一个函数free(...)来释放它的内存,一个人会定义

~A(){ user_matrix::free(mx); /*etc*/}
Run Code Online (Sandbox Code Playgroud)

既然default_deleter<>会打电话delete,那就是我应该使用的理解~A().但是,Josuttis(C++标准库:教程和参考)一书中第5.2节"关联资源的删除"下的目录打开和关闭的示例表明,可能需要声明一个特殊的删除器来执行这个,所以我很困惑....这是因为,在给定的例子中,类DIR没有使用的析构函数closedir(...)

c++ destructor unique-ptr delete-operator

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

C++静态而不是动态多态

我正在尝试构建一个通用算法.到目前为止,我已经使用类层次结构和指针实现了这一点,如下例所示:

struct Base{
    virtual double fn(double x){return 0;}
};

class Derived : public  Base{
    double A;
public:
    Derived(double a) : A(a) {}
    double fn(double x) { return A*x;}
};

//Some other implementations

class algo{
    double T;
    std::unique_ptr<Base> b_ptr;
public:
    algo(double t, std::unique_ptr<Base>& _ptr); //move constructor...
    //Some constructors
    double method(double x){ return T*b_ptr->fn(x);}

};
Run Code Online (Sandbox Code Playgroud)

然后按如下方式实现此设置:

int main(){
    std::unique_ptr<Derived> ptr(new Derived(5.4));
    algo(3.2,ptr);
    method(2.4);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,这是一个非常简单的例子,但它适用于我的问题.据我所知,以这种方式使用派生类意味着该方法是在运行时而不是在编译时选择的.因为我的算法不需要任何动态行为 - 所有内容都是在编译时确定的 - 这是一种不必要的效率损失.有没有办法在编译时执行上述操作,即静态多态?

据我所知,只有使用模板才能获得静态多态性.但是,我无法找到具有非基本类型的工具模板.如上例所示,我需要使用非默认构造函数的派生类,这似乎不可能......任何人都可以提供任何解决方案来解决这个问题吗?

c++ templates static-polymorphism

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

宏中的宏运行速度比C中的全局变量快吗?如何在运行之间更改宏?

我正在用C语言编写一个程序,其中有几个常量我希望我的所有函数都可以使用.到目前为止,我已经使用了宏.该程序的简化版本如下所示.

#define CONSTANT 10 //int
int multiplication_by_constant(int a){ return a*CONSTANT;}
int main(){
   for(int i = 1; i< 10; i++)
       printf("%d\n",multiplication_by_constant(i));
}
Run Code Online (Sandbox Code Playgroud)

现在我想通过使用不同的常量值运行几次来对程序进行实验.我想自动执行此操作,而不是每次更改CONSTANT时都不重新编译.我使用一个简单的解决方案,将宏更改为全局变量,将原始main函数放入新的'program()'函数,然后在主文件中运行实验,即

int CONSTANT =  10; //int
int multiplication_by_constant(int a){ return a*CONSTANT;}
void program(){
   for(int i = 1; i< 10; i++)
       printf("%d\n",multiplication_by_constant(i));
}
int main(){
   while(CONSTANT < 100){
       program();
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我发现这种实现导致了循环性能的相当大的损失

for(int i = 1; i< 10; i++)
       printf("%d\n",multiplication_by_constant(i));
Run Code Online (Sandbox Code Playgroud)

现在比使用宏时需要大约50%的运行时间.这是正常的吗?

任何人都可以建议我更有效地运行我的实验吗?

PS在C++中,我会通过定义一个'类程序',将CONSTANT设置为类成员并将'multiplication_by_constant'设置为成员函数来实现.然后我可以使用类定义轻松地通过'main'运行实验,我想我不会有效率损失......我必须在这个实现中使用C,这就是为什么我使用了全局变量和功能.

c macros

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

何时使用模板而不是派生类

除了简化的通用算法之外,模板在类层次结构上是否有任何好处?例如,在类层次结构中使用模板是否更有效?模板受到程序员对金融工具的高度赞扬,但我并不理解为什么.

c++ comparison templates derived-class

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

将`double`转换为`string`

我正在实施这个:

double x;
ostringstream x_convert;
x_convert << x;
string x_str = x_convert.str();
Run Code Online (Sandbox Code Playgroud)

这看起来有点多余.有更优雅的方式吗?

c++ string double type-conversion

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