From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 62515 invoked by alias); 19 Jun 2017 18:23:55 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 62493 invoked by uid 89); 19 Jun 2017 18:23:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=Missed X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 19 Jun 2017 18:23:52 +0000 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AA70AC04B945; Mon, 19 Jun 2017 18:23:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com AA70AC04B945 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=sergiodj@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com AA70AC04B945 Received: from localhost (unused-10-15-17-193.yyz.redhat.com [10.15.17.193]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8193218156; Mon, 19 Jun 2017 18:23:56 +0000 (UTC) From: Sergio Durigan Junior To: Pedro Alves Cc: Simon Marchi , GDB Patches Subject: Re: [PATCH v6] C++ify gdb/common/environ.c References: <20170413040455.23996-1-sergiodj@redhat.com> <20170619043531.32394-1-sergiodj@redhat.com> <87k248y3zp.fsf@redhat.com> <8aabc6fabb04f4e3e8b08e6fa1b0eacc@polymtl.ca> <816a5744-b3b4-855c-5f2e-4c9f0d255512@redhat.com> <1cff1a8055c0d770fef7171b8394e86d@polymtl.ca> <7cf7b53f-600a-32f5-c9d0-2f45a8bb2b46@redhat.com> <50ea9e5c05e31e1e459f22901ee86527@polymtl.ca> <9be4fd14-279e-3dde-656d-3ea6b9aab148@redhat.com> <87tw3bx3i4.fsf@redhat.com> <1e62abc1-ab02-65dd-f520-27120be033b8@redhat.com> Date: Mon, 19 Jun 2017 18:23:00 -0000 In-Reply-To: <1e62abc1-ab02-65dd-f520-27120be033b8@redhat.com> (Pedro Alves's message of "Mon, 19 Jun 2017 19:09:27 +0100") Message-ID: <87lgonx2dg.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2017-06/txt/msg00533.txt.bz2 On Monday, June 19 2017, Pedro Alves wrote: > On 06/19/2017 06:59 PM, Sergio Durigan Junior wrote: >> On Monday, June 19 2017, Pedro Alves wrote: >> >>> On 06/19/2017 05:26 PM, Simon Marchi wrote: >>>> On 2017-06-19 17:44, Pedro Alves wrote: >>>>> If we take the "always push a NULL on construction" approach, and >>>>> we want moved-from gdb_environs to be valid, then yes. Note how this >>>>> results in extra heap allocations when e.g., returning a >>>>> gdb_environ from functions by value, and makes std::vector >>>>> much less efficient when it decides it needs to reallocate/move >>>>> elements. Representing the empty state with a cleared internal >>>>> vector would avoid this. >>>> >>>> Given the move case, since the goal is to be efficient, then yeah I >>>> would agree >>>> that it would make sense to make a little bit of efforts to avoid >>>> allocating >>>> memory for an objects we are almost certainly throwing away. >>>> >>>> But still, in order to leave environ objects in a valid state after a >>>> move and >>>> to pedantically comply with the STL spec which says that the vector is >>>> left in >>>> an unspecified state, shouldn't we do a .clear () on the moved-from >>>> vector after >>>> the move? >>> >>> See accepted answer at: >>> >>> https://stackoverflow.com/questions/17730689/is-a-moved-from-vector-always-empty >>> >>> So the only case where it'd be needed would be in op=, and iff the >>> vectors had different allocators, which is not the case here. >>> So no, it's not necessary. But I'd be fine with calling it. >>> >>>> >>>>> Note BTW, that we need to be careful with self-move leaving the >>>>> *this object in a valid state. >>>> >>>> Should we just do >>>> >>>> if (&other == this) >>>> return *this; >>> >>> Might not be necessary if without that the object ends up >>> valid anyway. But what you wrote is a safe bet. >> >> So, what do you guys think about the patch below, which applies on top >> of the original? > > Missed fixing move ctor? > > + /* Move constructor. */ > + gdb_environ (gdb_environ &&e) > + : m_environ_vector (std::move (e.m_environ_vector)) > + {} Indeed. Fixed now. I'll submit v7. Thanks, -- Sergio GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36 Please send encrypted e-mail if possible http://sergiodj.net/