LINUX.ORG.RU

История изменений

Исправление proud_anon, (текущая версия) :

адрес должен быть кратен выравниванию элемента (12 не кратно 8)

Не адрес, а размер, если только ты не хотел написать тавтологию. Выравнивание NN, как тебе сообщил gcc, почему-то равно 4. 12 кратно 4.

Сейчас я проверил у себя:

% g++ --version
g++ (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

% g++ -std=c++0x -fpermissive -march=i686 -m32 -mtune=generic -O0 -o testalign testalign.cc

% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 4
sizeof NN(в норме 16) == 12
array difference(в норме 16) == 12

% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
testalign.cc: In function ‘int main()’:
testalign.cc:17:72: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
                                                                        ^
testalign.cc:17:86: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;

% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16

Исправление proud_anon, :

адрес должен быть кратен выравниванию элемента (12 не кратно 8)

Не адрес, а размер, если только ты не хотел написать тавтологию. Выравнивание NN, как тебе сообщил gcc, почему-то равно 4. 12 кратно 4.

Сейчас я проверил у себя:

% g++ --version
g++ (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

% g++ -std=c++0x -fpermissive -march=i686 -m32 -mtune=generic -O0 -o testalign testalign.cc
% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 4
sizeof NN(в норме 16) == 12
array difference(в норме 16) == 12
% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16
% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
testalign.cc: In function ‘int main()’:
testalign.cc:17:72: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
                                                                        ^
testalign.cc:17:86: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16

Исправление proud_anon, :

адрес должен быть кратен выравниванию элемента (12 не кратно 8)

Не адрес, а размер, если только ты не хотел написать тавтологию. Выравнивание NN, как тебе сообщил gcc, почему-то равно 4. 12 кратно 4.

Сейчас я проверил у себя:

% g++ (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

% g++ --version
g++ -std=c++0x -fpermissive -march=i686 -m32 -mtune=generic -O0 -o testalign testalign.cc
% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 4
sizeof NN(в норме 16) == 12
array difference(в норме 16) == 12
% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16
% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
testalign.cc: In function ‘int main()’:
testalign.cc:17:72: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
                                                                        ^
testalign.cc:17:86: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16

Исходная версия proud_anon, :

адрес должен быть кратен выравниванию элемента (12 не кратно 8)

Не адрес, а размер, если только ты не хотел написать тавтологию. Выравнивание NN, как тебе сообщил gcc, почему-то равно 4. 12 кратно 4.

Сейчас я проверил у себя:

% g++ (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

% g++ -std=c++0x -fpermissive -march=i686 -m32 -mtune=generic -O0 -o testalign testalign.cc
% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 4
sizeof NN(в норме 16) == 12
array difference(в норме 16) == 12
% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16
% g++ -std=c++0x -fpermissive -march=x86-64 -m64 -mtune=generic -O0 -o testalign testalign.cc
testalign.cc: In function ‘int main()’:
testalign.cc:17:72: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
                                                                        ^
testalign.cc:17:86: warning: cast from ‘NN*’ to ‘int’ loses precision [-fpermissive]
     std::cout << "array difference(в норме 16) == " << (int)&ar[1] - (int)&ar[0] << std::endl;
% ./testalign
alignof double(в норме 8) == 8
alignof NN(в норме 8) == 8
sizeof NN(в норме 16) == 16
array difference(в норме 16) == 16