On 10/2/18 5:25 PM, Marek Polacek wrote:
On Mon, Oct 01, 2018 at 07:47:10PM -0400, Jason Merrill wrote:
On Mon, Oct 1, 2018 at 6:41 PM Marek Polacek <pola...@redhat.com> wrote:

This patch implements C++20 explicit(bool), as described in:
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0892r2.html>.

I tried to follow the noexcept specifier implementation where I could, which
made the non-template parts of this fairly easy.  To make explicit(expr) work
with dependent expressions, I had to add DECL_EXPLICIT_SPEC to lang_decl_fn,
which serves as a vessel to get the explicit-specifier to tsubst_function_decl
where I substitute the dependent arguments.

What's the impact of that on memory consumption?  I'm nervous about
adding another word to most functions when it's not useful to most of
them.  For several similar things we've been using hash tables on the
side.

Yeah, that is a fair concern.  I'm not sure if I know of a good way to measure
it.  I took wide-int.ii and ran /usr/bin/time -v ./cc1plus; then it's roughly
Maximum resident set size (kbytes): 95020
vs.                             
Maximum resident set size (kbytes): 95272
which doesn't seem too bad but I don't know if it proves anything.

If we went with the hash table, would it work like this?
1) have a hash table mapping decls (key) to explicit-specifiers
2) instead of setting DECL_EXPLICIT_SPEC put the parsed explicit-specifier
    into the table
3) in tsubst_function_decl look if the fn decl is associated with any
    explicit-specifier, if it is, substitute it, and set DECL_NONCONVERTING_P
    accordingly.

Sounds right, maybe with the flag idea I mentioned in the other email to say it's worth looking in the hash table. Hashing can be by tree address of course.

natha

--
Nathan Sidwell

Reply via email to