Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
2685 / 1856 / 552
Регистрация: 05.06.2014
Сообщений: 5,361
1

Странная сигнатура std::align

02.07.2017, 06:47. Просмотров 518. Ответов 2
Метки нет (Все метки)

Есть в стандартной библиотеке функция std::align. Принимает на вход указатель на хранилище, размер объекта создаваемого в хранилище, желаемое выравнивание и размер хранилища. Возвращает выравненный указатель. Размер хранилища функция принимает по ссылке, но этот самый размер не меняет.
И так, вопрос: нафига функция принимает размер хранилища по не константной ссылке, если ничего по этой ссылке менять не хочет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    char buf[1024];
    void*storage=buf;
 
    //так не скомпилируется, потому что std::align ссылку на константный space не кушает
    //const std::size_t space=sizeof(buf);
    std::size_t space=sizeof(buf);
    std::cout<<space<<std::endl;
 
    //так тоже не скомпилируется, потому что передачу space по значению std::align не понимает
    //std::align(alignof(int),sizeof(int),storage,sizeof(buf));
    std::align(alignof(int),sizeof(int),storage,space);
 
    //но никаких изменений в space мы все равно не увидим. Так зачем не константную ссылку на space вымогали?
    std::cout<<space<<std::endl;//1024 было, 1024 и осталось
    return 0;
}
UPD А, пардон, присмотрелся - там подписано "and decreases space argument". То есть, выравнивание оно вычтет само, а размер объекта вычитайте сами. Странная логика, но теперь хоть понятно зачем ссылка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2017, 06:47
Ответы с готовыми решениями:

Сигнатура std::function и прототип метода
Добрый вечер, #include &lt;functional&gt; #include &lt;string&gt; #include &lt;iostream&gt; using namespace...

Странная ошибка: [Error] no match for call to '(std::string {aka std::basic_string<char>}) (int&)'
У меня появляется проблема при компиляции сей программы: #include &lt;iostream&gt; #include &lt;string&gt;...

Странная ошибка invalid initialization of non-const reference of type 'std::vector<oneVec>::iterator&
Пишу я значит двухмерный вектор, решаю проверить наличие ошибок(я просто компилирую) и выдают такую...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

2
Заблокирован
04.07.2017, 02:17 2
Цитата Сообщение от Renji Посмотреть сообщение
выравнивание оно вычтет само, а размер объекта вычитайте сами. Странная логика
Почему странная? Оно называется std::align, а не std::aling_and_if_it_was_successful_copy_one_object_at_the_b eginning. Если бы оно кроме выравнивания копировало один объект в начало, тогда был бы смысл вычитать его размер.
0
2685 / 1856 / 552
Регистрация: 05.06.2014
Сообщений: 5,361
04.07.2017, 09:28  [ТС] 3
Цитата Сообщение от daun-autist Посмотреть сообщение
Почему странная?
Потому что для простого выравнивания ни размер буфера space, ни размер объекта вообще не нужны. std::align должно хватать двух аргументов - выравниваемого указателя и желаемого выравнивания. Если же std::align задумывался как комбайн для "выравнять указатель и отдать под объект", то от комбайна логично ждать что он и размер объекта из space вычтет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2017, 09:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы....

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Std::bind, std::mem_fun, std::mem_fn
В чем разница между функциями std::bind, std::mem_fun, std::mem_fn?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.