Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 28.06.2017, 13:52   #171
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 460
Репутация: 107
По умолчанию

Бг...никада б не подумал, еще в универе в 1998 (т.е. доС99) учили нас именно использовать юнион для трюков.
Хотя странности замечал, почти всегда нада его делать (packed), иначе не летает при передаче данных м-у разными битнесс или сохранении в файл.

Последний раз редактировалось alexzk; 28.06.2017 в 13:56.
alexzk на форуме   Ответить с цитированием
Старый 28.06.2017, 14:11   #172
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 9,777
Репутация: 1544

icq: 216409213
По умолчанию

Вы со структурами их не спутали?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 28.06.2017, 15:58   #173
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
одинаково, потому что (примерно)

strcat = strlen + strcpy
да, и в 1 случае мы получаем 2 strlen + 2 strcpy,
а во 2: 3 strlen + 2 strcpy

разве не быстрее?
bugaboo вне форума   Ответить с цитированием
Старый 28.06.2017, 16:04   #174
Croessmah
Вредный кошак
Профессионал
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Адрес: г. Инза
Сообщений: 1,104
Репутация: 362
По умолчанию

И здесь выложу, пусть валяется
Код:

//clang 3.8.0
 
#include <iostream>
#include <memory>
#include <cstring>
 
#include <list>
#include <string>
 
namespace details__
{
template<typename C>
std::enable_if_t<std::is_class<C>::value, std::size_t>
get_length(const C &c)
{
    return c.size();
}
 
 
std::size_t get_length(const char *str)
{
    return strlen(str);
}
 
 
 
template<typename C>
std::enable_if_t<
    std::is_class<C>::value,
    std::pair<typename C::const_iterator, typename C::const_iterator>
>
get_beginend(const C &c, std::size_t)
{
    return {std::begin(c), std::end(c)};
}
 
 
std::pair<const char *, const char *>
get_beginend(const char *str, std::size_t size)
{
    return {str, str + size};
}
 
 
 
template<typename Iterator>
char *
copy_to_buffer(char *buffer, const std::pair<Iterator, Iterator> &beginend)
{
    return std::copy(beginend.first, beginend.second, buffer);
}
    
    
}//details__
 
 
 
 
template<typename ... Args>
std::unique_ptr<char[]> concat(Args &&...args)
{
    using fake_array_t = int[];
    using length_array_t = std::size_t[];
    std::size_t all_size = 0;
    std::size_t cs = 0;
    length_array_t lengths_of_strings {
            (cs = details__::get_length(args), all_size += cs, cs)...
    };
 
    std::unique_ptr<char[]> result(new char[all_size + 1]);
 
    char *current = result.get();
    std::size_t length_index = 0;
 
    fake_array_t {
        (current = details__::copy_to_buffer(current, details__::get_beginend(args, lengths_of_strings[length_index])), ++length_index, 0)...
    };
 
    *current = 0;
 
    return result;
}
 
 
 
int main()
{
    char arr[] = "BLA";
    const char *ps = "->";
    std::string s = "-";
    std::list<char> lst {'e', 'n', 'd'};
    std::cout << concat("bla", s, arr, s, "bla", " ", ps, " ", lst).get() << std::endl;
}

http://rextester.com/OSO16460
Croessmah вне форума   Ответить с цитированием
Старый 29.06.2017, 18:17   #175
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Вот так ровно на 1 байт копирования быстрее
Код:

auto la = strlen(a);
char* c = new char[la + strlen(b) + 1];
memcpy(c, a);
strcpy(c + la, b);
Вы, наверно, имели в виду
Код:

	auto la = strlen(a);
	char* c = new char[la + strlen(b) + 1];
	memcpy(c, a, la);
	strcpy(c + la, b);

?
bugaboo вне форума   Ответить с цитированием
Старый 29.06.2017, 18:53   #176
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 460
Репутация: 107
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
Вы, наверно, имели в виду
Код:

	auto la = strlen(a);
	char* c = new char[la + strlen(b) + 1];
	memcpy(c, a, la);
	strcpy(c + la, b);

?
ну да...
alexzk на форуме   Ответить с цитированием
Старый 29.06.2017, 19:20   #177
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
ну да...
а что насчет скорости?
http://www.programmersforum.ru/showp...&postcount=173
bugaboo вне форума   Ответить с цитированием
Старый 29.06.2017, 19:24   #178
bugaboo
Форумчанин
 
Регистрация: 18.06.2017
Сообщений: 55
Репутация: 10
По умолчанию

А вот так без warningов, воще отлично
Код:

#include <cstring>
#include <iostream>
using namespace std;
int main()
{
	const char* a = "blabla";						// статический
	char* b = new char[10];							// динамический
	memcpy(b, "BLABLABLA", 10);
	auto la = strlen(a);
	auto lb = strlen(b);
	char* c = new char[la + lb + 1];					// динамический
	memcpy(c, a, la);
	memcpy(c + la, b, lb + 1);
	cout << c << endl;
	delete[] c;
	delete[] b;
	return 0;
}

bugaboo вне форума   Ответить с цитированием
Старый 29.06.2017, 21:28   #179
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 460
Репутация: 107
По умолчанию

Цитата:
Сообщение от bugaboo Посмотреть сообщение
а что насчет скорости?
http://www.programmersforum.ru/showp...&postcount=173
..сделайте цикл на 10000 повторов копий, запишите время начала и конца и посчитайте. Ток нада чета придумать, чтоб его оптимизатор не выбросил.
alexzk на форуме   Ответить с цитированием
Старый 29.06.2017, 21:31   #180
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,046
Репутация: 1520
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
чтоб его оптимизатор не выбросил
А еще кэширование надо отключить...
waleri вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX сложить два числа gansm Assembler 13 29.10.2010 05:16
как сложить два числа с плавающей точкой forsy Assembler 19 29.03.2010 02:15
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 23:02
Сложить два числа и вывести результат на экран We1c0m3 Assembler 2 23.05.2009 11:41
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27




08:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru