Форум программистов, компьютерный форум CyberForum.ru

Нюансы использования оператора sizeof() - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
thick_int
Заблокирован
21.11.2011, 11:53     Нюансы использования оператора sizeof() #1
Пусть T - это некоторой тип, а t - это переменная типа T.
Может ли когда-нибудь выражение
C++
1
sizeof(T) != sizeof t
оказаться верным?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2011, 11:53     Нюансы использования оператора sizeof()
Посмотрите здесь:

C++ Нюансы использования операторов new/delete в деструкторах
C++ Нюансы использования абстрактных базовых классов (класс Shape)
C++ Объяснить разницу между массивом типа char и строкой в стиле Си (нюансы использования нуль-терминатора)
C++ Раздельная компиляция (нюансы использования заголовочных файлов и файлов реализации)
C++ Нюансы использования исключений: объяснить причины и способы устранения ошибки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
21.11.2011, 11:57     Нюансы использования оператора sizeof() #2
Цитата Сообщение от thick_int Посмотреть сообщение
Пусть T - это некоторой тип, а t - это переменная типа T.
Может ли когда-нибудь выражение
C++
1
sizeof(T) != sizeof t
оказаться верным?
Скорее всего, нет. Но если мне приведут контрпример, буду весьма благодарен.

Добавлено через 1 минуту
Во всяком случае в Си без плюсов это точно так.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 11:59     Нюансы использования оператора sizeof() #3
thick_int, sizeof всегда будет совпадать, а вот фактический размер может отличаться
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
21.11.2011, 12:02     Нюансы использования оператора sizeof() #4
Цитата Сообщение от Jupiter Посмотреть сообщение
thick_int, sizeof всегда будет совпадать, а вот фактический размер может отличаться
Как это?
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
21.11.2011, 12:06     Нюансы использования оператора sizeof() #5
добавлю, что sizeof выполняется на этапе компиляции, и не вычисляет значения выражения, а только его тип
i.e. такой код полностью корректен:
C
1
2
int *p = NULL;
sizeof(*p);
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
21.11.2011, 12:10     Нюансы использования оператора sizeof() #6
Добавлено через 1 минуту
Во всяком случае в Си без плюсов это точно так.
Почти так, только тут подвох в другом.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  
  printf("%d\n", sizeof('a'));
  printf("%d\n", sizeof(char));
  system("PAUSE");  
  return 0;
}
Результат 4, 1
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 12:10     Нюансы использования оператора sizeof() #7
Байт,
C++
1
2
3
4
5
6
std::string str1("abcdefgihgklmnopqrstuxyzw1234567890");
std::string str2;
std::cout << sizeof(str1) << std::endl;
std::cout << sizeof(str2) << std::endl;
std::cout << str1.size() << std::endl;
std::cout << str2.size() << std::endl;
http://liveworkspace.org/code/12d0ab...8b25d72c8ca85a
KuKu, в Си символьный литерал(то что в одинарных кавычках) считается интом
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2011, 12:12     Нюансы использования оператора sizeof() #8
Цитата Сообщение от Net_Wanderer
добавлю, что sizeof выполняется на этапе компиляции, и не вычисляет значения выражения, а только его тип
i.e. такой код полностью корректен:
это не одно и то же

надо так:
C
1
    sizeof(int *) == sizeof(p)
не факт, что:
C
1
    sizeof(int *) == sizeof(*p)
C
1
    sizeof(int *) == sizeof(int)
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
21.11.2011, 12:13     Нюансы использования оператора sizeof() #9
KuKu, в C, символьные литералы имеют тип int
в C++ - char
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
21.11.2011, 12:14     Нюансы использования оператора sizeof() #10
Jupiter, ну формально, это ответ на вопрос) Подвох и есть в приведение типов.

KuKu, в Си символьный литерал(то что в одинарных кавычках) считается интом
Вы имеете ввиду идет приведение типов по умолчанию, или это просто инт? Как тогда можно явно задать один символ чар?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 12:25     Нюансы использования оператора sizeof() #11
Цитата Сообщение от KuKu Посмотреть сообщение
Вы имеете ввиду идет приведение типов по умолчанию, или это просто инт?
вот тут уж точно не скажу, предположу что это зависит от реализации

Цитата Сообщение от KuKu Посмотреть сообщение
Как тогда можно явно задать один символ чар?
так и задавать)
Bers
Заблокирован
21.11.2011, 12:25     Нюансы использования оператора sizeof() #12
C++
1
2
3
4
5
6
7
8
void Foo(char val) { std::cout<< "char\n";}
void Foo(int val ) { std::cout<< "int\n";}
 
int main()
{
    Foo('t'); //вывод: char
    return 0;
}

В си можно сделать явное приведение в стиле си




C
1
2
3
4
5
6
7
8
void Foo(char val) { std::cout<< "char\n";}
void Foo(int val ) { std::cout<< "int\n";}
 
int main()
{
    Foo( (char) 't'); //вывод: char
    return 0;
}
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,946
21.11.2011, 12:29     Нюансы использования оператора sizeof() #13
так и задавать)
ну так не интересно( Вдруг кому-то надо константно задавать символы, и чтобы размер был один байт. Можно так кнечно писать, но что-то не то (char)'a'.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
21.11.2011, 12:30     Нюансы использования оператора sizeof() #14
accept, я не понял, что вы хотели сказать, в моем посте нет никаких сравнений, я хотел добавить, что sizeof выполняется в компильтайме, и что "разыменование" NULL-поинтера внутри sizeof'a допустимо
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
21.11.2011, 12:30     Нюансы использования оператора sizeof() #15
Jupiter, не убедили. sizeof и size - это разные вещи.
thick_int
Заблокирован
21.11.2011, 12:40  [ТС]     Нюансы использования оператора sizeof() #16
Понятно, спасибо.
Да были у меня какие-то сомнения то есть путаница между размером типа и длиной, ну например символьной строки.
Байт
 Аватар для Байт
13988 / 8819 / 1230
Регистрация: 24.12.2010
Сообщений: 15,975
21.11.2011, 12:42     Нюансы использования оператора sizeof() #17
Если вы имеете в виду объем памяти, занимаемый объектом, вместе со всем, что выделено для него в куче, тогда безусловно вы правы. Но к sizeof это не имеет никакого отношения
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2011, 12:58     Нюансы использования оператора sizeof() #18
Цитата Сообщение от Net_Wanderer
accept, я не понял, что вы хотели сказать
то, на что указывает переменная-указатель, не имеет никакого отношения к содержимому переменной-указателя

здесь написано одно
здесь написано другое
thick_int
Заблокирован
21.11.2011, 13:11  [ТС]     Нюансы использования оператора sizeof() #19
А заодно поясниите еще такое затруднение:
Верно ли, что массив типа char (Пример
C++
1
char a[] = "Test"
), инициализированный строкой в стиле C в реальности имеет тип const char []? Во всяком случае ведет он себя именно так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 13:28     Нюансы использования оператора sizeof()
Еще ссылки по теме:

C++ Как корректно прервать цикл? (нюансы использования циклов, операторов ветвления и оператора break)
C++ Нюансы синтаксиса и тонкости использования указателей и массивов
Нюансы использования динамических массивов в качестве данных-членов в классах C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 13:28     Нюансы использования оператора sizeof() #20
по умолчанию то что в двойных кавычках(строковый литерал) имеет тип const char[](потому что мы не может написать вот так
C++
1
"TestStr" = ...
), а символьный массив а просто инициализируется этим строковым литералом
Yandex
Объявления
21.11.2011, 13:28     Нюансы использования оператора sizeof()
Ответ Создать тему
Опции темы

Текущее время: 10:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru