Boost logo

Boost :

Subject: [boost] [align] [review] Pre-review comments
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2014-03-29 00:33:54


AMDG

I saw the announcement of the review and decided
to take a look at the library today.

All the following is based on:

commit 0d361143c18254efddacfd48775a2776ca7d5e11
Author: Glen Fernandes <glenfe_at_[hidden]>
Date: Thu Mar 27 17:45:12 2014 -0700

Documentation:

align:

"alignment shall be a fundamental alignment value or
an extended alignment value and a power of two."

Please define these terms. Also
warning: suggest parentheses around ‘and’ within ‘or’ [-Wparentheses]

aligned_alloc:

I notice that alignment is only required to be a
power of two. Is there a reason this is different
from align?

aligned_allocator:

template<class T, size_t Alignment = 1>
class aligned_allocator;

I'd really like to see the requirements on
Alignment written out somewhere, even if we
can deduce it from the fact that it calls
aligned_alloc. Also, does the standard
guarantee that all alignments are powers
of 2? Otherwise lcm(2^k, alignof(T)) is
not guaranteed to be a power of 2. If
it is guaranteed, then
lcm(2^k, alignof(T)) == max(2^k, alignof(T))
This is probably worth noting.

aligned_allocator notes:

"Specifying minimum alignment is generally only suitable for
containers such as vector and undesirable with other,
node-based, containers." I had to think about this
for a few seconds. If you're going to say this, you
should probably explain why.

aligned_allocator_adaptor:

    template<class A>
    aligned_allocator_adaptor(A&& alloc);

Not explicit? Should aligned_allocator_adaptor
really be convertible from anything?

template<class U>
aligned_allocator_adaptor(const
    aligned_allocator_adaptor<U, Alignment>& other);

    Requires: Allocator shall be constructible from A.

Copy/paste error. There is no A here.

pointer allocate(size_type n, const_void_pointer hint = 0);

    Requires: hint is a value obtained by calling allocate(), or else
nullptr.

Calling allocate on what? Not just this object, but
any equivalent aligned_allocator_adaptor, should work.

aligned_allocator_adaptor notes

"This adaptor class can be used with any C++11 or
C++03 allocator including those allocators whose
pointer type is a smart pointer."

I don't see how this could possibly work with
a smart pointer when aligned_allocator_adaptor
explicitly uses raw pointers.

Your tests pass for we with msvc 9.0-12.0, gcc-mingw-4.6.2,
and clang-3.4 on Windows and with gcc 4.7.2 on Linux.

aligned_allocator.hpp:100
    aligned_free(memory);
This is vulnerable to ADL if std::aligned_free is
ever created (or my_ns::aligned_free for that matter).
(Note that the corresponding aligned_alloc is safe
becase std::size_t has no associated namespaces)

aligned_allocator.hpp:104
    enum {
        Size = static_cast<std::size_t>(-1) / sizeof(T)
    };
There's absolutely no reason to use an enum as far as
I can see. You can just return this value.

aligned_allocator.hpp:139
    memory->~U();
I seem to recall msvc warning that
memory is unused in cases like this.
You may need to supress the warning.

detail/align.hpp:28

    if (n1 <= space && size <= space - n1)

You might add a comment about avoiding overflow,
so that no one is tempted to refactor it into
an simpler "equivalent" test.

test/Jamfile.v2:

This is a lot more verbose than it needs to be.
Try just:

import testing ;
run align_test.cpp ;
run aligned_alloc_test.cpp ;
...

test-suite is obsolete (it just groups
all the targets under a single name,
which is completely pointless when that's
all you have in the Jamfile) and the braces
just create a compound statement (like in C++)

test/align_test.cpp:

You need to test the following:
- There is not enough space in the buffer.
- In particular, you need to validate the exact
  boundaries where align starts to return 0.

test/aligned_alloc_test.cpp:

You need tests for the following conditions:
- size == 0
- size < alignment
- size > alignment && gcd(size, alignment) != alignment
- the allocation fails because size is too large.
- Also write to the allocated memory to (hopefully) verify
  that the data structure used by aligned_alloc is safely
  outside this region.

test/aligned_allocator_adaptor_test.cpp:

You're only testing allocate/deallocate. You
also need tests for the other members.

- rebind
- copy constructor/copy assignment operator
- construct/destroy
- allocate with a hint
- allocate with 0 size

test/aligned_allocator_test.cpp:

same as aligned_allocator_adaptor_test.cpp.

test/is_aligned_test.cpp

You need tests for:
- is_aligned returns false. Your entire test suite would
  pass with bool is_aligned(...) { return true; }

In Christ,
Steven Watanabe


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk