Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用不同的参数C+调用函数+;_C++_Performance_Coding Style - Fatal编程技术网

C++ 使用不同的参数C+调用函数+;

C++ 使用不同的参数C+调用函数+;,c++,performance,coding-style,C++,Performance,Coding Style,这个问题只是为了改进。下面有一个函数: void Func_A(u8* arg) { bool local_arg=false; if(!arg) { //allocate memory for arg local_arg=true; } //process arg 我使用NULL和非NULL参数从多个位置调用此函数。 我只是想问一下,有没有更好的方法来处理这种情况而不使用本地参数。您有时可以使用 u8* p = arg ? a

这个问题只是为了改进。下面有一个函数:

void Func_A(u8* arg) {
    bool local_arg=false;
    if(!arg) {
        //allocate memory for arg 
        local_arg=true;
    }
    //process arg
我使用NULL和非NULL参数从多个位置调用此函数。
我只是想问一下,有没有更好的方法来处理这种情况而不使用本地参数。

您有时可以使用

u8* p = arg ? arg : new u8(...);

...do things with *p...

if (!arg) delete p;
您可以编写一个具有运行时可配置所有权的智能指针:

template <typename T>
class Uncertain_Ownership_Ptr
{
  public:
    enum Ownership { Own_It, Dont_Own_It };
    Uncertain_Ownership_Ptr(T* p, Ownership own) : p_(p), own_(own) { }
    Uncertain_Ownership_Ptr(const Uncertain_Ownership_Ptr&) = delete;
    void operator=(const Uncertain_Ownership_Ptr&) = delete;
    ~Uncertain_Ownership_Ptr() { if (own_ == Own_It) delete p_; }
    T& operator*() { return *p_; }
    const T& operator*() const { return *p_; }
    T* operator->() { return p_; }
    const T* operator->() const { return p_; }
  private:
    T* p_;
    Ownership own_;
};

如果你能描述一下
*arg
是输入还是输出,以及
Func\u A
如果
arg
为空意味着要完成什么,那会很有帮助。你可以尝试函数的默认参数,但我不太确定这对你的情况是否会有很大的改变。
local\u arg
在你的代码中没有任何作用。您应该发布一个更现实的示例。arg只是一个空变量。在进程arg中,我正在读取此arg中的文件。Local_arg用于最终释放内存。您知道,您可以编辑问题以添加相关信息。
void Func_A(u8* arg)
{
    Uncertain_Ownership_Ptr p(arg ? arg : new u8(...),
        arg ? Uncertain_Ownership_Ptr::Dont_Own_It : Uncertain_Ownership_Ptr::Own_It);

    // use *p ...
}