Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

Последний раз редактировалось alexzk; 28.06.2017 в 12:56.
alexzk вне форума Ответить с цитированием
Старый 28.06.2017, 13:11   #172
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы со структурами их не спутали?
p51x вне форума Ответить с цитированием
Старый 28.06.2017, 14:58   #173
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

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

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

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

И здесь выложу, пусть валяется
Код:
//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, 17:17   #175
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от 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, 17:53   #176
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от 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, 18:20   #177
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

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

А вот так без 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, 20:28   #179
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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