• Re: 我用llvm写了一个数据库,可以商业出售吗

    换了你是老板,你会买吗?

    【 在 ludongxing (ludongxing) 的大作中提到: 】

    : 我是想这样,我自己写的数据库是由我本人来对每一位客户提供终身售后服务的,

    : 包括我替他们安装数据库、建立符合BCNF标准范式的表、建立触发器、创建过程

    : 和函数,以及回答各种数据库理论知识,等等各方面的服务我都提供。我自己用

    : ...................

    08月13日
  • Re: 为啥virtual clone(),返回智能指针,不能covariance?

    因为并不知道实际使用时拿的是一个 Base 还是 Child,有的地方会用 Base* 去调用,有的会用 Child* 去调用

    Base *p;

    p->Clone()  // 它返回Base*

    Child *q;

    q->Clone()  // 期望它直接给出的Child*,而不是返回一个Base*,然后需要我再cast成Child*

    【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】

    : 我不是很明白这种接口设计的意义在什么地方?

    : 如果在使用的时候,拿的是Child的object,Clone直接定义在Child里就可以,不需要virtual,无非每个Child类不要忘记定义Clone就是了

    : 如果在使用的时候,拿的是Base的object,怎么可能返回一个unique_ptr<Child>的指针?Base类中本来就不会含有Child的信息

    : ...................

    05月09日
  • Re: 为啥virtual clone(),返回智能指针,不能covariance?

    只要标准愿意引入这个特性,大小不相同不是障碍,加一个 covariant return thunk 即可

    这种 thunk 在 C++98 的基类/子类指针的 covariance 情况下已经存在(多继承的情形)

    class A {

    public:

    virtual ~A() = default;

    };

    class B {

    public:

    virtual B* clone() const = 0;

    virtual ~B() = default;

    };

    class C : public A, public B {

    public:

    C* clone() const override { return new C(*this); }

    };

    在 gcc 的实现里,除了生成 C::clone() 本身以外,还要生成两个 thunk:

    00000000004011e0 <covariant return thunk to C::clone() const>:

    4011e0:       48 83 ec 08             sub    $0x8,%rsp

    4011e4:       e8 c7 ff ff ff          callq  4011b0 <C::clone() const>

    4011e9:       48 85 c0                test   %rax,%rax

    4011ec:       48 8d 50 08             lea    0x8(%rax),%rdx

    4011f0:       48 0f 45 c2             cmovne %rdx,%rax

    4011f4:       48 83 c4 08             add    $0x8,%rsp

    4011f8:       c3                      retq

    4011f9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

    0000000000401200 <covariant return thunk to C::clone() const>:

    401200:       48 83 ef 08             sub    $0x8,%rdi

    401204:       eb da                   jmp    4011e0 <covariant return thunk to C::clone() const>

    401206:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)

    40120d:       00 00 00

    如果要在 covariance 支持更复杂的转换,在 thunk 里生成不同的代码就是了

    【 在 here080 (hero080) 的大作中提到: 】

    : 标  题: Re: 为啥virtual clone(),返回智能指针,不能covariance?

    : 发信站: 水木社区 (Sat May  8 16:24:22 2021), 站内

    : 无法支持,隐形转换不保证大小相同啊。

    : 如果要支持,估计得新加入covariance转换的概念了。

    : 【 在 vonNeumann 的大作中提到: 】

    : : unique_ptr 毕竟是库实现的,如果要支持,怕是得对所有可以隐式转换的类型都支持才行。。如果单独给 unique_ptr/shared_ptr 开口子那太难看。。

    : :

    : --

    05月09日
  • Re: 好厉害

    他没有想清楚这个问题,不代表他因为这个问题走火入魔

    这话。。你从传教士那里听来的?

    实际上牛顿根本就不是“最后”沉迷宗教,人家从来就认为所有自然规律都是神规定的,他只是找到了神定下的规则。在他的思想体系下,科学与神学就没分过家。

    【 在 xiaoju (可爱的龙猫) 的大作中提到: 】

    : 无穷小量的争议从希腊神话时代就有,牛顿也直接参与了英法关于微积分发明权的争斗,这个问题显然对他有过困扰

    : 神学的基础是哲学和逻辑,很多科学家最后沉迷宗教都是因为一两个逻辑上的缺陷无法弥补

    05月08日
  • Re: 麻烦哪位亲给看看,到底哪错了啊?

    中文冒号改成英文冒号

    【 在 kisspanda (反封建、反“精神控制”义务宣传大使) 的大作中提到: 】

    :  改了,继续报错……

    :    File "<ipython-input-10-c51b8eabbcc7>", line 3

    :     if -9999<= dn <=-1000 or 1000<= dn <=9999 :

    : ...................

    05月08日
  • Re: 为啥virtual clone(),返回智能指针,不能covariance?

    不奇葩啊,裸指针从 C++98 开始就支持这样写,只是智能指针不行

    【 在 Madlee (无竹居士) 的大作中提到: 】

    : 主要是你的需求太奇葩。

    05月08日
  • Re: 为啥virtual clone(),返回智能指针,不能covariance?

    unique_ptr 毕竟是库实现的,如果要支持,怕是得对所有可以隐式转换的类型都支持才行。。如果单独给 unique_ptr/shared_ptr 开口子那太难看。。

    【 在 DoorWay (DoorWay) 的大作中提到: 】

    : 这玩意儿理论上的难点在哪儿?为啥不做成标准、编译器直接支持呢。

    05月08日
  • Re: 为啥virtual clone(),返回智能指针,不能covariance?

    遇到过,没想到很优雅的解决办法。后来干脆直接返回裸指针了,调用处用 unique_ptr 来接返回值。

    【 在 DoorWay (DoorWay) 的大作中提到: 】

    : virtual unique_ptr<Child> Child::Clone() override;

    : 最近有这种需求,子类提供克隆方法,返回自身类型的智能指针,不行。必须返回基类的智能指针?

    : 这种一般怎么设计解决?

    : ...................

    05月08日
  • Re: 好厉害

    你记错了,牛顿用上帝来解释的是第一推动力问题。

    (其实,牛顿作为自然神论者,第一推动力由神赋予是自然而然的事情,现代在无神论环境下长大的人难以理解其逻辑罢了。)

    你说的那个问题叫无穷小量问题,或者叫第二次数学危机,牛顿本人虽然解释不清楚,他自己并没有太纠结此事。关于无穷小量的大争论,是 Berkeley 大主教写了一篇批评牛顿的文章以后才爆发,此时牛顿已经去世好几年了。

    【 在 xiaoju (可爱的龙猫) 的大作中提到: 】

    : 形式化定义是微积分几百年来的乌云,马克思从历史角度上论述过

    : 牛顿在数学方面想不透,就走火入魔了

    05月08日
  • Re: 如何知道系统服务通过哪个脚本启动的

    systemd 的好处这时候就显示出来了

    【 在 gamecmd (gamecmd) 的大作中提到: 】

    : 一个嵌入式的linux系统,装有optware,能看到init.d下的启动脚本,但是自己编写脚本放进去并不能开启启动,如何知道系统是通过什么路径开机启动服务的呢?

    05月07日
  • Re: 现在很多来源库都是c11标准写的

    使用第三方库是很正当的理由了,这个不算“跟风”

    【 在 toutouqi (toutouqi) 的大作中提到: 】

    : 没必要盲目跟风,代码积极跟进标准的都是养了很多闲人的公司。

    04月25日
  • Re: 现在很多来源库都是c11标准写的

    C++11 和 C11 不是同一个东西

    【 在 GoGoRoger (逝者如斯夫) 的大作中提到: 】

    : 我们的程序还是cpp98,甚至很多老机器gcc还是4.6,不支持c11标准,用不了。

    04月25日
  • Re: 这段代码可能存在啥问题?

    这里的问题跟 put 让不让 rm 为空没有关系

    【 在 iwannabe (I wanna be) 的大作中提到: 】

    : put也不能让rm为空吧

    04月23日
  • Re: 这段代码可能存在啥问题?

    这哥们之前还提交过一些更无语的 patch,比如这个 https://lore.kernel.org/lkml/20210407000913.2207831-1-pakki001@umn.edu/

    --- a/net/rds/send.c

    +++ b/net/rds/send.c

    @@ -665,7 +665,7 @@ static void rds_send_remove_from_sock(struct list_head *messages, int status)

    unlock_and_drop:

    spin_unlock_irqrestore(&rm->m_rs_lock, flags);

    rds_message_put(rm);

    -               if (was_on_sock)

    +               if (was_on_sock && rm)

    rds_message_put(rm);

    }

    上面一行都直接用 rm 了,下一行莫名其妙又加一个判断 rm 是否为空

    【 在 qlogic (戒网了) 的大作中提到: 】

    : 看明大一个博士生提交了一个patch,被批

    : -    xxx_put(msg);

    : +    if(msg)

    : ...................

    04月23日
  • Re: 这段代码可能存在啥问题?

    看完整这个函数的上下文:

    static void

    gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)

    {

    struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg);

    if (msg->errno < 0) {

    refcount_inc(&gss_msg->count);

    gss_unhash_msg(gss_msg);

    if (msg->errno == -ETIMEDOUT)

    warn_gssd();

    gss_release_msg(gss_msg);

    }

    gss_release_msg(gss_msg);

    }

    这个函数显然约定了输入的 msg 不是 NULL(因为上面已经直接用了),从而 gss_msg 也不可能是 NULL,在这里加一个对它是否为 NULL 的判断没有任何意义。

    他认为这里有 double free。后面有人解释了,其实没有,只不过原来的代码写得不好,if 里面那一对 refcount_inc/gss_release_msg 是多余的,不仔细看会以为它有 double free 。即便真有 double free,正确的修复方式也是删掉 if 里面那一句 gss_release_msg,他加的那一句判断 gss_msg 是否为 NULL 属于莫名其妙。

    【 在 qlogic (戒网了) 的大作中提到: 】

    : 标  题: 这段代码可能存在啥问题?

    : 发信站: 水木社区 (Fri Apr 23 12:58:41 2021), 转信

    : 看明大一个博士生提交了一个patch,被批

    : -    xxx_put(msg);

    : +    if(msg)

    : +      xxx_put(msg);

    : 这个修改可能引入什么问题?

    : 是不是put之前需要检查msg的引用计数,if/put之间不是原子性操作,可能导致问题?

    : --

    04月23日
  • Re: [讨论] Process 真是不好翻译

    不赞成。

    翻译没有义务解决原文就存在的问题。

    专业术语的翻译要尽可能保持一一映射,一对多、多对一的翻译都只会让读者更困惑。

    【 在 lambdago (foool) 的大作中提到: 】

    : 谢谢解释,

    : 是不是可以考虑中文可以用新的中文名词,如核程,表示内核态任务/进程Process的含义(类似于一词多义),类似于协程表示用户态线程,虽然它有对应的英文名称coroutine。

    04月21日
  • Re: 美国同事不让我们用blacklist这个词 (转载)

    blackbox testing --> opaque box testing / closed box testing

    【 在 nikezhang (难得糊涂) 的大作中提到: 】

    : 黑盒测试呢?飞机上的黑匣子呢

    04月21日
  • Re: 美国同事不让我们用blacklist这个词 (转载)

    大部分只要求用户界面,代码里也要严格要求的应该不多

    【 在 PaoloMaldini (solo con te) 的大作中提到: 】

    : 后面这一条,应该稍微有点常识的外企都这么执行了

    04月21日
  • Re: 主题:请教UTF8和ANSI 转换问题,要抓狂了。

    我们之前有些代码积极拥抱新标准,用了 u8"..." 来强调字符串是 UTF-8 编码(其实源代码也是 UTF-8,加个 u8 只是为了强调)

    结果 C++20 把 u8"..." 的类型从 const char[] 改成 const char8_t[],而且 const char8_t* 还不能隐式转为 const char*,一堆地方要改,一种吃了屎的感觉

    如果说标准建议凡是 Unicode 字符串都用 char8_t/char16_t/char32_t,想要 deprecate 掉 char/wchar_t,那也行,我都能接受这种阵痛。但尼玛他们又不把支持搞全,std::locale 不支持也就算了,连 C++20 才新增的 std::format 也只有 char/wchar_t 的版本,没有 char8_t/char16_t/char32_t 的版本,真是不知道他们想给我们什么导向。

    【 在 hgoldfish (老鱼) 的大作中提到: 】

    : 个人觉得 win msvc 的做法是不对的。c++11 的标准引入 u8, u 这些做法也是自讨苦吃。

    : 我的做法是所有的源代码都要求是 utf-8,直接用 "" 普通字符串表达式,在 windows 底下,要求 msvc 使用 utf-8 编码:

    : add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")

    : ...................

    04月21日
  • Re: 美国同事不让我们用blacklist这个词 (转载)

    至少五年前就听过微软禁止使用 white list, black list 了,不仅是用户界面不能用,变量/函数命名也不行

    微软还禁用 country,必须写全 country or region

    【 在 hothail (沸冰!无尽的华尔兹) 的大作中提到: 】

    : 据说,微软很早就搞过这个

    : 最近是漫延到master上

    04月21日