Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sizeof(std::string) == 32, Почему ??? 
V
    Опции темы
Любитель
Дата 29.7.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Предварительно обработать данные - без сомнения. Создать какое-нибудь индексное B-дерево. А затем легко и приятно всё, что надо добавлять и пр. txt и прямой перебор - явно не удачное решение smile


--------------------
PM MAIL ICQ Skype   Вверх
andrew_121
Дата 29.7.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Lazin @  29.7.2008,  12:57 Найти цитируемый пост)
а на что время в основном тратится? 

На std::sort(), std::unique() и далее на итерации по словам между словарями.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 29.7.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(andrew_121 @  29.7.2008,  13:22 Найти цитируемый пост)
std::sort(), std::unique()

тогда логично для этого использовать структуры данных, на которых эти операции имели бы сложность О(1) или O(ln(N))
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 29.7.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Всем Преогромное Спасибо  smile 
Приступаю к реализации.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
SABROG
Дата 29.7.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(andrew_121 @ 29.7.2008,  15:00)
Всем Преогромное Спасибо  smile 
Приступаю к реализации.

Решил тоже сравнить на своей тачке скорость:

gcc
Цитата

"running test batch for STL strings........."
+0.000056: string string
-0.000059: string1 string2
-0.000049: 1string 2string
-0.000055: string string1
-0.000059: string1 string
"running test batch for C strings........."
+0.000022: string string
-0.000022: string1 string2
-0.000013: 1string 2string
-0.000022: string string1
-0.000022: string1 string


msvc
Цитата

"running test batch for STL strings........."
+0.000102
-0.000104
-0.000102
-0.000100
-0.000104
"running test batch for C strings........."
+0.000029
-0.000029
-0.000018
-0.000029
-0.000029

А это сравнение идентичных строк удвоенной длинны (gcc):

Цитата

"running test batch for STL strings........."
+0.000066: stringstring stringstring
+0.000069: string1string2 string1string2
+0.000069: 1string2string 1string2string
+0.000068: stringstring1 stringstring1
+0.000068: string1string string1string
"running test batch for C strings........."
+0.000034: stringstring stringstring
+0.000039: string1string2 string1string2
+0.000038: 1string2string 1string2string
+0.000031: stringstring1 stringstring1
+0.000031: string1string string1string


Цитата

>g++ -v
Reading specs from C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --e
nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-ja
va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz
ation --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.2 (mingw-special)


Собирал проги без каких-либо ключей оптимизации, т.е. тупо:

Код

g++ -o stl stl.cpp
g++ -o c c.cpp


Код

cl c.cpp
cl stl.cpp


Тесты проводились под Win2000SP4.


Это сообщение отредактировал(а) SABROG - 29.7.2008, 18:34


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 29.7.2008, 18:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



SABROG, в VS по умолчанию stl проверяет выход за границы контейнера, это отключается каким-то макросом... результат для msvc должен быть близок к результату gcc
кстати на очень длинных строках результат может каардинално измениться... smile 
PM MAIL Skype GTalk   Вверх
SABROG
Дата 29.7.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Lazin @ 29.7.2008,  18:55)
SABROG, в VS по умолчанию stl проверяет выход за границы контейнера, это отключается каким-то макросом... результат для msvc должен быть близок к результату gcc
кстати на очень длинных строках результат может каардинално измениться... smile

Запущу тесты на ночь на длинных строках. Завтра запощу.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 29.7.2008, 20:18 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



ну не на столько-же длинных smile 
PM MAIL Skype GTalk   Вверх
Torsten
Дата 30.7.2008, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Цитата(andrew_121 @  29.7.2008,  10:53 Найти цитируемый пост)
Это что за нехороший класс такой. Его размер больше хранимой в нем строки!

Это сделано специально, чтобы когда ты увеличиваешь размер строки память не пришлось перевыделять (новую выделить, скопировать элементы, старую удалить).
Так делают все stl контейнеры.
Так же есть метод reserve, через который можно установить желаемый размер, но он будет установлен, только если текующий зарезирвированный размер меньше.

--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
vinter
Дата 30.7.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Torsten @  30.7.2008,  09:36 Найти цитируемый пост)
Это сделано специально, чтобы когда ты увеличиваешь размер строки память не пришлось перевыделять (новую выделить, скопировать элементы, старую удалить).

string хранит указатель на память, размер строки не влияет на размер string
Цитата(Torsten @  30.7.2008,  09:36 Найти цитируемый пост)
Так делают все stl контейнеры.

зависит от реализации.


--------------------
Мой блог
PM MAIL WWW   Вверх
SABROG
Дата 30.7.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(Lazin @ 29.7.2008,  20:18)
ну не на столько-же длинных smile

Сегодня не судьба. Ночью в офисе вырубило электричество все результаты пропали.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Любитель
Дата 30.7.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Torsten @  30.7.2008,  08:36 Найти цитируемый пост)
Это сделано специально, чтобы когда ты увеличиваешь размер строки память не пришлось перевыделять (новую выделить, скопировать элементы, старую удалить).
Так делают все stl контейнеры.
Так же есть метод reserve, через который можно установить желаемый размер, но он будет установлен, только если текующий зарезирвированный размер меньше.

Размер самой строки через sizeof вообще не возможно получить smile Мы получаем размер всех полей класса: указателя на строку (4 байта), её физический размер (4 байта), её логический размер (4 байта). Откуда взялось отсальное - фиг его знает, надо смотреть smile Ну, плюс выравнивани не забываем!


--------------------
PM MAIL ICQ Skype   Вверх
andrew_121
Дата 30.7.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Любитель @  30.7.2008,  13:25 Найти цитируемый пост)
Размер самой строки через sizeof вообще не возможно получить smile Мы получаем размер всех полей класса: указателя на строку (4 байта), её физический размер (4 байта), её логический размер (4 байта). Откуда взялось отсальное - фиг его знает, надо смотреть smile Ну, плюс выравнивани не забываем!


Это понятно. Но откуда взялись 32 байта smile 
Это походу 8 указателей, или что-то еще...бред...
А в Лине кто-то проверял?
Щас в Mingw проверю.

Добавлено через 13 минут и 42 секунды
Проверил. Вот результаты.
Код


#include <string>
#include <vector>
#include <iostream>

int main() {

    std::string str;
    std::vector<char> cv;
    std::vector<int> iv;
    int sz1 = sizeof(str);
    int sz2 = sizeof(cv);
    int sz3 = sizeof(iv);
    
    std::cout<< "sizeof(std::string)       = " << sz1 << std::endl
                << "sizeof(std::vector<char>) = " << sz2 << std::endl
                << "sizeof(std::vector<int>)  = " << sz3 << std::endl;
    
    return 0;
}


Для MSVC-2008, компилил из командной строки, без каких либо опций.
Код

sizeof(std::string)       = 28
sizeof(std::vector<char>) = 24
sizeof(std::vector<int>)  = 24


И для Mingw:
Код

sizeof(std::string)       = 4
sizeof(std::vector<char>) = 12
sizeof(std::vector<int>)  = 12


Тоже без опций. Разница на лицо.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Любитель
Дата 30.7.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



О, ещё аллокатор и итератор для начала. Может и для конца. А итератор - это уже не 4 байта...


--------------------
PM MAIL ICQ Skype   Вверх
Lazin
Дата 30.7.2008, 14:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



в студии нужно компилить с таким дефайном
Код

#define _SECURE_SCL 0

что-бы все было честно smile 
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.