为什么从结构数组返回时不调用 this(this) ?

发布于 2025-01-06 13:05:18 字数 1042 浏览 0 评论 0原文

import std.stdio;

struct S
{
    string m_str = "defaultString";
    
    this(this)
    {
        writeln("In this(this)");
    }
    
    ~this()
    {
        writeln("In ~this():"~m_str);
    }
    
}

struct Holder
{
    S[] m_arr;
    S m_s;
    
    this(S[] arr)
    {
        m_arr = arr;
        m_s.m_str="H.m_s";
    }
    
    S getSMem()
    {
        return m_s;
    }
    
    S getSVec()
    {
        return m_arr[0];
    }
    
    S getSLocal()
    {
        S local = S("localString");
        return local;
    }
}

void main()
{
    Holder h = Holder(new S[1]);
    
    S s1 =  h.getSMem();
    S s2 =  h.getSVec();
    S s3 =  h.getSLocal();
}

上面的 D2.058 给出:

在这个(这个)

在 ~this():localString

在 ~this():defaultString 中

在~this()中:H.m_s

在~this()中:H.m_s

上面只产生了一个 this(this)(来自getSMem() 调用)。 getSLocal() 调用只能移动结构。但是,为什么 getSVec() 不会产生 this(this) 呢?我注意到这是 std.container.Array 中保存的引用计数结构的上下文,与 ~this() 相比,对 this(this) 的调用太少了。

import std.stdio;

struct S
{
    string m_str = "defaultString";
    
    this(this)
    {
        writeln("In this(this)");
    }
    
    ~this()
    {
        writeln("In ~this():"~m_str);
    }
    
}

struct Holder
{
    S[] m_arr;
    S m_s;
    
    this(S[] arr)
    {
        m_arr = arr;
        m_s.m_str="H.m_s";
    }
    
    S getSMem()
    {
        return m_s;
    }
    
    S getSVec()
    {
        return m_arr[0];
    }
    
    S getSLocal()
    {
        S local = S("localString");
        return local;
    }
}

void main()
{
    Holder h = Holder(new S[1]);
    
    S s1 =  h.getSMem();
    S s2 =  h.getSVec();
    S s3 =  h.getSLocal();
}

The above in D2.058 gives:

In this(this)

In ~this():localString

In ~this():defaultString

In ~this():H.m_s

In ~this():H.m_s

Only one this(this) is produced in the above (from the getSMem() call). The getSLocal() call can just move the struct. However, why does getSVec() not result in a this(this)? I noticed this is the context of a reference counting struct held in a std.container.Array, and there were too few calls to this(this) compared to ~this().

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

拥有 2025-01-13 13:05:18

对于 getSVec,它看起来像是一个错误,可能与 这个,虽然情况不完全一样。不过,您应该报告您的具体示例,因为它可能不是完全相同的错误。

但是,正如您所说,在 getSLocal 的情况下,局部变量会被移动,因此不会发生复制,也不需要 postblit 调用。只是 getSVec 有问题。

In the case of getSVec, it looks like a bug, possibly related to this one, though the situation is not exactly the same. You should report your specific example though, since it may not be the exact same bug.

However, as you say, in the case of getSLocal, the local variable is moved, so no copying takes place, and no postblit call is required. It's just getSVec which is buggy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文