#include <vector>
#include <iostream>
using namespace std;
template <typename T>
void log_alignment(const T* t)
{
unsigned long long address = reinterpret_cast<unsigned long long>(t);
int max_alignment_check = 1024;
for (; max_alignment_check>1; max_alignment_check/=2)
{
if (address % max_alignment_check == 0)
break;
}
std::cout << "Address 0x" << std::hex << address << " is " << std::dec << max_alignment_check << " bytes aligned.\n";
}
struct B {
alignas(128) float data[32];
};
int main()
{
B b1;
B* b_ptr = new B;
B* b_arr = new B[2];
std::vector<B> b_vec1(10);
std::vector<B> b_vec2(10);
B b2;
log_alignment(&b1);
log_alignment(&b2);
log_alignment(b_ptr);
log_alignment(b_arr);
log_alignment(b_vec1.data());
log_alignment(b_vec2.data());
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGxvZ19hbGlnbm1lbnQoY29uc3QgVCogdCkKewogIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyZXNzID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KHQpOyAgCgogIGludCBtYXhfYWxpZ25tZW50X2NoZWNrID0gMTAyNDsKICBmb3IgKDsgbWF4X2FsaWdubWVudF9jaGVjaz4xOyBtYXhfYWxpZ25tZW50X2NoZWNrLz0yKQogIHsKICAgIGlmIChhZGRyZXNzICUgbWF4X2FsaWdubWVudF9jaGVjayA9PSAwKQogICAgICBicmVhazsKICB9CgogIHN0ZDo6Y291dCA8PCAiQWRkcmVzcyAweCIgPDwgc3RkOjpoZXggPDwgYWRkcmVzcyA8PCAiIGlzICIgPDwgc3RkOjpkZWMgPDwgbWF4X2FsaWdubWVudF9jaGVjayA8PCAiIGJ5dGVzIGFsaWduZWQuXG4iOwp9CgpzdHJ1Y3QgQiB7CiAgYWxpZ25hcygxMjgpIGZsb2F0IGRhdGFbMzJdOwp9OwoKaW50IG1haW4oKQp7CiAgQiBiMTsKICBCKiBiX3B0ciA9IG5ldyBCOwogIEIqIGJfYXJyID0gbmV3IEJbMl07ICAKICBzdGQ6OnZlY3RvcjxCPiBiX3ZlYzEoMTApOwogIHN0ZDo6dmVjdG9yPEI+IGJfdmVjMigxMCk7CiAgQiBiMjsKCiAgbG9nX2FsaWdubWVudCgmYjEpOwogIGxvZ19hbGlnbm1lbnQoJmIyKTsKICBsb2dfYWxpZ25tZW50KGJfcHRyKTsKICBsb2dfYWxpZ25tZW50KGJfYXJyKTsgIAogIGxvZ19hbGlnbm1lbnQoYl92ZWMxLmRhdGEoKSk7CiAgbG9nX2FsaWdubWVudChiX3ZlYzIuZGF0YSgpKTsKfQ==