Re[6]: C vs. C++
От: A13x США  
Дата: 11.09.12 13:58
Оценка:
Здравствуйте, MasterZiv, Вы писали:


>> С++ прост как палка.


По сравнению с чем?
По сравнению с С или Java это очень сильно не так, говорю исходя из собственного опыта, особенно вспоминая мой давний опыт windows программирования когда приходилось использовать COM компоненты в MFC приложении.
Re[4]: C vs. C++
От: igna Россия  
Дата: 11.09.12 14:02
Оценка:
Здравствуйте, denisko, Вы писали:

Спасибо, а как сообщать об ошибке, если файл не прочитался или память не разместилась?
Re[7]: C vs. C++
От: Piko  
Дата: 11.09.12 14:10
Оценка: 6 (1) +1
Здравствуйте, SilentNoise, Вы писали:

SN>>>>>Потому что очень много низкокачественных С++ программистов (перешедших с С), которые

SN>>>>>верят в то, что компилятор соптимизирует их монструозные конструкции на шаблонах,
P>>>>таки соптимизирует! http://eigen.tuxfamily.org/index.php?title=Benchmark
P>>>>и оптимизирует уже как минимум 14 лет http://www.osl.iu.edu/publications/prints/1998/siek98%3A_siamoo.pdf
P>>>>таки соптимизирует! http://eigen.tuxfamily.org/index.php?title=Benchmark
SN>>>И не раздует при этом бинарник до космических размеров?
P>>как минимум не больше рукопашная кодогенерация
P>>http://www.osl.iu.edu/publications/prints/1998/siek98%3A_siamoo.pdf
P>> As an example, to provide basic functionality for selected sparse matrix
P>> types, the NIST implementation of the Sparse BLAS [18] contains over 10,000 routines and
P>> a code generation system.
SN>Ага, но экспоненциально больше чем использование void* и функции.

во-первых, какие-либо тесты будут? или только "экспоненциальный" трёп? а то ведь это место скользкое — push/pop, frame stuff и т.п. может стоит больше по размеру чем инлайн малюсенькой функции.
во-вторых, мы вроде про оптимизацию говорим, и видимо по скорости, не? Ну а если нужна оптимизация по размеру — то и она получится лучше и безопасней на C++
Re: C vs. C++
От: Centaur Россия  
Дата: 11.09.12 14:14
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Есть тут кто-нибудь, кто предпочитает C вместо C++ хотя бы и для отдельных проектов?


Писать на C не люблю*, но считаю необходимым уметь его читать. Потому что это lingua franca, общий знаменатель для взаимодействия всего со всем.

* Постоянно скатываюсь в плюсизмы — то переменную объявлю по месту использования, то void в аргументах функции забуду.

I>Использую libxml2, это библиотека на C, и решил из интереса попробовать и свой модуль, непосредственно использующий libxml2, написать на C.


Над libxml2 есть обёртка libxml++.
Re[8]: C vs. C++
От: SilentNoise  
Дата: 11.09.12 14:18
Оценка:
Здравствуйте, Piko, Вы писали:

P>во-первых, какие-либо тесты будут?

Если тебе не очевидно, что при использовании шаблонов для эмуляции полиморфизма они будут развернуты с дублированием кода, то тут нечего добавить.
Re[5]: C vs. C++
От: denisko http://sdeniskos.blogspot.com/
Дата: 11.09.12 14:22
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, denisko, Вы писали:


I>Спасибо, а как сообщать об ошибке, если файл не прочитался или память не разместилась?

Поскольку я считаю, что ошибки априори достаточно редки то пишу так

backupState(god);
char** result = get_lines_as_strings(FILE * file, GodStruct* god, int* errorCode);
if(result == NULL)
{
  if(errorCode == FILE_READ_ERROR)
    reportFileNotRead(..);
  else if(errorCode == MEMORY_ALLOC_ERROR)
  {
    rollbackState(god);
    reportMemoryAllocError(god);
  }
}

Многие используют исключения на longjumpax, некоторые меняют местами errorCode и result
<Подпись удалена модератором>
Re[5]: C vs. C++
От: Alexéy Sudachén Чили  
Дата: 11.09.12 14:23
Оценка:
I>Но у меня есть еще один вопрос, как сообщать об ошибке, если файл не прочитался или память не разместилась? Менять сигнатуру функции? Просто вернуть нулевой указатель недостаточно, если нужно различать между двумя причинами ошибки.

Бросить разные исключения?
Re[4]: C vs. C++
От: ntp  
Дата: 11.09.12 14:27
Оценка:
Здравствуйте, Alexéy Sudachén, Вы писали:

AS>Условно говоря —

Грязный код..
Re[9]: C vs. C++
От: igna Россия  
Дата: 11.09.12 14:30
Оценка:
Здравствуйте, SilentNoise, Вы писали:

SN>Если тебе не очевидно, что при использовании шаблонов для эмуляции полиморфизма они будут развернуты с дублированием кода, то тут нечего добавить.


Вроде бы этого можно избежать, нет?:

class my_vector_impl {
    friend class my_vector;
    . . .
    void* f(void*);
    . . .
};

template <class T>
class my_vector {
    my_vector_impl impl_;
public:
    . . .
    T* f(T* p) { return reinterpret_cast<T*>(impl_.f(p)); }
    . . .
Re[5]: C vs. C++
От: Alexéy Sudachén Чили  
Дата: 11.09.12 14:32
Оценка: :)
AS>>Короче, https://github.com/alexeysudachen/libyoyo — там всё написано.
DR>Йоу, массив. Ой, возьми строчки. Ой, прочитал строку. Библиотека, йо, йо — вотс ап, дог?

Ты таки офигительно прав! Именно так. ))) Изначально это было что-то типа шутки. Первая версия эксперимента, кстати, вообще называлась junk. Но как-то так оказалось что в этой шутке, доля шутки уж больно микроскопическая, а простота использования ставит C++ в какое-то непонятное положение. От оно как бывает.
Re[6]: C vs. C++
От: igna Россия  
Дата: 11.09.12 14:32
Оценка:
Здравствуйте, Alexéy Sudachén, Вы писали:

AS>Бросить разные исключения?


В C?
Re[5]: C vs. C++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 11.09.12 14:32
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

I>Но у меня есть еще один вопрос, как сообщать об ошибке, если файл не прочитался или память не разместилась? Менять сигнатуру функции? Просто вернуть нулевой указатель недостаточно, если нужно различать между двумя причинами ошибки.


errno обычно установлена соответственно
Re[7]: C vs. C++
От: Alexéy Sudachén Чили  
Дата: 11.09.12 14:34
Оценка:
AS>>Бросить разные исключения?
I>В C?

Ну да, а что такого? Я довольно подробно тут как-то показывал как это сделать.
Re[5]: C vs. C++
От: Alexéy Sudachén Чили  
Дата: 11.09.12 14:35
Оценка:
AS>>Условно говоря —
ntp>Грязный код..

Покажи чистый. Буду знать как надо писать правильно.
Re[9]: C vs. C++
От: Piko  
Дата: 11.09.12 14:38
Оценка: +1
Здравствуйте, SilentNoise, Вы писали:

P>во-первых, какие-либо тесты будут? или только "экспоненциальный" трёп? а то ведь это место скользкое — push/pop, frame stuff и т.п. может стоит больше по размеру чем инлайн малюсенькой функции.

P>во-вторых, мы вроде про оптимизацию говорим, и видимо по скорости, не? Ну а если нужна оптимизация по размеру — то и она получится лучше и безопасней на C++
SN>Если тебе не очевидно, что при использовании шаблонов для эмуляции полиморфизма они будут развернуты с дублированием кода, то тут нечего добавить.

если тебе не очевидно, что дублирование может оптимизироваться до суммарных размеров меньших чем с void*, а то и вообще до нулевых, то я

например, напиши void* аналог:
template<typename T>
inline const T& max(const T &a, const T &b)
{
    return (a<b) ? b : a;
}
Re[6]: C vs. C++
От: denisko http://sdeniskos.blogspot.com/
Дата: 11.09.12 14:38
Оценка:
Здравствуйте, Alexéy Sudachén, Вы писали:

AS>>>Короче, https://github.com/alexeysudachen/libyoyo — там всё написано.

DR>>Йоу, массив. Ой, возьми строчки. Ой, прочитал строку. Библиотека, йо, йо — вотс ап, дог?

AS>Ты таки офигительно прав! Именно так. ))) Изначально это было что-то типа шутки. Первая версия эксперимента, кстати, вообще называлась junk. Но как-то так оказалось что в этой шутке, доля шутки уж больно микроскопическая, а простота использования ставит C++ в какое-то непонятное положение. От оно как бывает.

А в чем именно _преимущества_ перед плюсами на обычных платформах, где размер кода роли не играет? Тебе по-любому придется часть вещей делать через макродрочество, которое заменяется на шаблоны с небольшим/большим распуханием по коду но делающими ровно тоже самое. Пользоваться своими менеджерами памяти объектов и ты в плюсах можешь.
<Подпись удалена модератором>
Re[7]: C vs. C++
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 11.09.12 14:41
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Alexéy Sudachén, Вы писали:


AS>>Бросить разные исключения?


I>В C?


В C если кровь из носу нужны исключения, то обычно используется long jump. Там можно пробросить код при желании. Примерно так:

struct context * restrict ctx = allocate_context;
int error_code = setjmp(ctx->jmp_on_error);
if (error_code == 0)
  perform_context_caclulation(ctx);

if (error_code)
{
  printf("Was error %d\n", error_code);
  // Мы можем хранить расширенную информацию в самом контексте
  // printf("Message %s\n", ctx->error_msg);
}

free_context(ctx);
Re[10]: C vs. C++
От: Piko  
Дата: 11.09.12 14:43
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

SN>>Если тебе не очевидно, что при использовании шаблонов для эмуляции полиморфизма они будут развернуты с дублированием кода, то тут нечего добавить.

I>Вроде бы этого можно избежать, нет?:
I> void* f(void*);

тсс, ты главное не говори ему про Technical Report on C++ Performance

I> T* f(T* p) { return reinterpret_cast<T*>(impl_.f(p)); }


лучше static_cast...
Re[11]: C vs. C++
От: igna Россия  
Дата: 11.09.12 14:46
Оценка:
Здравствуйте, Piko, Вы писали:

P>лучше static_cast...


Верно, но тогда надо не void*. Я просто хотел идею показать.
Re[11]: C vs. C++
От: Piko  
Дата: 11.09.12 14:46
Оценка:
Здравствуйте, Piko, Вы писали:

I>> T* f(T* p) { return reinterpret_cast<T*>(impl_.f(p)); }

P>лучше static_cast...

и только при касте обратно, в T*
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.