LINUX.ORG.RU

Не велосипед ли я придумал часом?

 , , ,


0

4

Типа , и чтобы инлайна не было, и чтобы в одном файле.

//Velosiped.h

#ifndef UNTITLED_VELOSIPED_H
#define UNTITLED_VELOSIPED_H

#include <stdio.h>

class Velosiped {
public:
    Velosiped();
    void print();
    virtual ~Velosiped();
};

#ifdef VELOSIPED_DEF

Velosiped::Velosiped() {
    printf("Ne velosiped ");
}

void Velosiped::print() {
    printf("li ya pridumal ");
}

Velosiped::~Velosiped() {
    printf("chasom ?");
}

#endif
#endif
//Velosiped.cpp
#define VELOSIPED_DEF
#include "Velosiped.h"
#undef VELOSIPED_DEF
//main.cpp
#include Velosiped.h
int main(){
    Velosiped velik;
    velik.print();
    return 0;
}

Может кто еще, что то похожее делает?



Последнее исправление: FreakMurderer (всего исправлений: 1)

Ответ на: комментарий от FreakMurderer

А ты можешь попросту не писать тело в другом месте и писать его вместе с объявлением? Зачем ты создал себе какие-то проблемы и героически придумал для них смысл, которого нет?

Возьми и напиши это как человек:

class Velosiped {
public:
    Velosiped() {
      printf("Ne velosiped ");
    }
    
    void print() {
      printf("li ya pridumal ");      
    }
    
    virtual ~Velosiped() {
      printf("chasom ?");      
    }
};
rustonelove
()

что за идея бредовая код в .h файле хранить?

xmikex ★★★★
()

Лишь один человек 'yoghurt' выразил более менее адекватное мнение по поводу моего примера, которое гласит:

«Я бы не стал заморачиваться, ибо решается какая-то несуществующая проблема.»

, также посоветовал

Лучше уж .cpp файл с реализацией инклудь в тело хедера под ифдефом, чем так.

И еще несколько сказали по теме..

Остальное преобладающее большинство либо вообще в танке или невнимательны, либо несут голимый офотоп, чушь и маразм.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Какой смешно ламерок попался. Табуретка кого-то тупым называет. Как это мило.

Ему разжевывают его проблему, а он огрызается. Огрызайся, мне с тебя не холодно не жарко. Просто - зачем?

rustonelove
()
Ответ на: комментарий от FreakMurderer

Как же нести чушь и маразм.

Лучше уж .cpp файл с реализацией инклудь в тело хедера под ифдефом, чем так.

Действительно, и насрать на то, что:

//Velosiped.h

#ifndef UNTITLED_VELOSIPED_H
#define UNTITLED_VELOSIPED_H

#include <stdio.h>

class Velosiped {
public:
    Velosiped();
    void print();
    virtual ~Velosiped();
};

#ifdef VELOSIPED_DEF

Velosiped::Velosiped() {
    printf("Ne velosiped ");
}

void Velosiped::print() {
    printf("li ya pridumal ");
}

Velosiped::~Velosiped() {
    printf("chasom ?");
}

#endif
#endif

Это и есть инклюд тела под ифдефом.

Но самое интересное. Ответы на вопрос: «как надевать футболку через жопу?» вида - «ну попробую встать на голову» наш «не чушь» считает адекватными.

Зачем слушать и отвечать на «а зачем ты вообще собрался одевать её через жопу?». Ведь это чушь и ахинея.

Хотя на таким вопросы как «зачем?» отвечать подобным персонажам не нужно. Через жопу, так через жопу.

rustonelove
()
Ответ на: комментарий от rustonelove

Я бы вызвал тебе скорую, но мне тебя почему не жалко )

FreakMurderer
() автор топика
Ответ на: комментарий от rustonelove

Ты путаешь причину со следствием. Суть моего сообщения была именно в том, чтобы тело перенести в отдельный файл с возможностью компилироваться по-нормальному, и при желании инлайниться как этого хочет ТС.

Однако проблема ТСа больше эргономическая, нежели техническая, так что этот совет тут действительно ни к чему.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

А возможно у меня не только эргономичечская, а ещё и та проблема, которая от ребят с гитхаба, и про которую вы не объяснили. А я ещё с ней не столкнулся или не осознал. Так что возможно мой подход решает 2 проблемы?

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Там все устроено так, чтобы код можно было легко надергать точечно, чтобы переиспользовать у себя (в большей части связано с проблемами с Windows)

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Ты путаешь причину со следствием.

Нет, ТС хочешь шизофрении. Зачем решать проблему, которая у него возникла, которая при этом смысла не имеет?

Суть моего сообщения была именно в том, чтобы тело перенести в отдельный файл с возможностью компилироваться по-нормальному

Ну дефолтную компиляцию сложно назвать «Нормальной».

и при желании инлайниться как этого хочет ТС.

На самом деле это не так-то просто. Хотя можно просто всё инлайнить с -fwhole-program.

При этом он не просил возможность фолбека, а спрашивал по поводу своей шизофрении. Т.е. он хочет писать всё в одном файле(за каким-то хреном инклюдя это в cpp), но что-бы у него «не было инлайна».

При этом с какого хрена у него возникла инлайнофобия - мне неясно, да и сам он ответить не смог. Прочитал где-то очередную херню и побежал.

Я ему дал дельный совет - зачем делать то, и следовать тому, назначение и смысл чего ты не понимаешь? Это же верх идиотии.

Однако проблема ТСа больше эргономическая, нежели техническая, так что этот совет тут действительно ни к чему.

Шизофреническая она. Он хочет писать header-only, но при этом нихрена не понимает зачем это нужно и просто помножил весь смысл на ноль под воздействием каких-то веществ.

И что самое интересное - у него даже одного файла нет - он насрал ещё cpp-файл, который постоянно надо дописывать, собирать и прилинковывать.

Тут явная шизофрения. Я хочу в одном файле, но файлов у меня два. Хрен знает чего он там хочет и объяснить ничего не может.

rustonelove
()
Ответ на: комментарий от yoghurt

Васян, который пастит .obj и задаёт подобные вопроса - явно сидит не с онтопика.

rustonelove
()

инлайн будет или не будет вне зависимости от твоих фокусов.

ключевое слово inline просто позволяет определять одну и ту же функцию в нескольких единицах трансляции.

dzidzitop ★★
()
Ответ на: комментарий от anonymous

Ну понятно, но можно значит так видоизменить, как выше посоветовали:

Лучше уж .cpp файл с реализацией инклудь в тело хедера под ифдефом, чем так.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Компилятор и линкер сами решат инлайнить им или нет. Если нужно строго не инлайнить по какой-то причине, то любые подобные фокусы не работают. А работают интринсики специфичные для компилятора.

«инлайновость» - это только (только!) возможность определить тело функции в нескольких единицах странсляции.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

Я проверял с методами,определёнными в классе, и вне класса.

С «вне класса» размер asm файлов, obj-файлов и exe файлов меньше. Извини, но не я не сторонник лишнего хлама, если конечно он иногда не влияет на скорость, но только в том случае, если она действительно необходима и существенна.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Даже я, забывающий плюсы, и то знал почему не стоит сувать код в хедеры. И ты еще жалуешься на «чушь & маразм» в ответах? В качестве обоснования ты высказал «ой, я устану скакать по файлам». На что тебе закономерно возразили что ты не умеешь пользоваться редакторами и их функциями, типа переход к определению и закладки.

А вообще, у меня к тебе никаких претензий :) Ну хочется тебе порно с зайчатами и котятами - кто же запретит, душа требует.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от FreakMurderer

С «вне класса» размер asm файлов, obj-файлов и exe файлов меньше. Извини, но не я не сторонник лишнего хлама, если конечно он иногда не влияет на скорость, но только в том случае, если она действительно необходима и существенна.

В это вся проблема, когда тот, кому суждено хвосты коровам крутить берётся за дело и лезет туда, куда не положено. Если ты не знаешь о том, что следует из «размера» asm-файлов, то строить какой-то анализ поверх незнания глупо, да и на анализ ты неспособен.

Хотя что и зачем я объясняю табуретки. Иди лабу делай - не отвлекайся.

rustonelove
()
Ответ на: комментарий от rustonelove

Какой смысл делать то, причины и следствия чего ты не осознаёшь? Просто так?

Ты же несортированные флоты складывал просто так, а щас видимо подзабыл и с важным видом лепечешь что-то про смысл.

anonymous
()
Ответ на: комментарий от FreakMurderer

То, что сегодня твой конкретный компилятор конкретной версии с конкретными опциями компиляции воспринимает inline как подсказку инлайнить вызов или нет, не обеспечивает переносимость на будущее и на другие копиляторы/условия компиляции.

А если ты борешься почему-то за размер бинарника, то компилируй с опцией -Os (если это gcc). Будет эффективнее танцев с бубном и inline.

И, к слову, маленький размер бинарника совершенно не означает скорость. Чаще всего всё наоборот.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 2)
Ответ на: комментарий от dzidzitop

Я тебя не пойму, ты мне хочешь сказать что компилятор будет инлайнить одинаково , что выноси методы наружу что нет? Да это бред полнейший, пока ты мне не предоставишь пруф. Или мне взять все современные версии gcc, cl clang и т.д и на каждом тестировать что ли, да ради бога - протестирую.

Конечно в таком случае , можна написать так, как этот кричащий идиот написал сверху. Но это же бред. Без пруфа можешь даже не писать...

FreakMurderer
() автор топика
Ответ на: комментарий от rustonelove

Есть D, есть Rust, наконец, есть FreePascal.
Всё это тормазнутый хлам.
rustonelove

Угу.

SEInterix
()
Ответ на: комментарий от FreakMurderer

Подсказка - определение члена-функции внутри определения класса это неявный inline.

А так - стандарт смотри.

Мне в целом пофиг что в интернете кто-то неправ. Но вот ссылка для затравочки:

https://isocpp.org/wiki/faq/inline-functions#overview-inline-fns

No matter how you designate a function as inline, it is a request that the compiler is allowed to ignore: the compiler might inline-expand some, all, or none of the places where you call a function designated as inline.

А ты скомпилируй код gcc с опцией -Os и посмотри будет инлайнить он функции или нет. Только функция должна использоваться в нескольких местах и быть относительно большой.

То, что inline на данный момент увеличивает score функции когда компилятор проверят нужно её инлайнить или нет - да. Но тот же gcc имеет встроенные (конфигурируемые) лимиты на то стоит ли инлайнить функцию в зависимости от объёма кода.

dzidzitop ★★
()
Ответ на: комментарий от FreakMurderer

А ты скомпилируй код gcc с опцией -Os и посмотри будет инлайнить он функции или нет. Только функция должна использоваться в нескольких местах и быть относительно большой.

Мне анализа asm файла хватает, где «call» а где инлайн.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

компилятору пофигу что ты там пишешь или не пишешь.

по той же ссылке:

Is there another way to tell the compiler to make a member function inline?

Yep: define the member function in the class body itself:


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

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

define the member function in the class body itself:

Я понимаю, что если писать инлайн явно или неявно, компилятор не всегда будут делать инлайн, но все же чаще - чем если вообще его не писать. На то оно и придумано это слово, будь оно не так и слова «inline» бы не было. И в конце концов, что ты хочешь сказать, нет разницы , где писать реализацию? Ответь конкретно?

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

если ты хочешь намекнуть компилятору, что нужно делать инлайн функции - то или в определении в заголовочном файле за пределами класса писать inline или в классе функции на пару строк без слова inline.

Если определять в заголовочном файле за пределами класса функцию, то inline нужен чтобы объектные файлы слинковались без ошибки. Подсказка компилятору что такую функцию нужно встраивать - это побочный эффект, на который можно рассчитывать, но никаких гарантий встраивания не будет.

Я слово inline использую агрессивно. А так - пиши как удобно.

class A { void f() {} };


эквивалентно

class A { void f(); };
inline void A::f() {}


с точки зрения встраиваемости, если всё это лежит в заголовочном файле.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

Почему ты мне тычешь свою теорию и уклоняешься от прямых вопросов: ещё раз: И в конце концов, что ты хочешь сказать, нет разницы , где писать реализацию? Ответь конкретно?

Ответ - да или нет. Если да, то почему? Если нет то почему , и в каких случаях нужно писать в определени, а в каких в теле? ! Жду конкретного ответа, иначе этот вопрос будет повторяться до победного конца.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Если определять в заголовочном файле за пределами класса функцию, то inline нужен чтобы объектные файлы слинковались без ошибки.

Если бы ты внимательно все читал в ветке , ты бы уже знал , что мне лишнего писать не надо, потому что : Не велосипед ли я придумал часом? (комментарий), я это уже и так знаю.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Я слово inline использую агрессивно. А так - пиши как удобно.

То есть пофиг, какой бы величины не была функция, будет ли жрать памяти или нет - все равно я «использую агрессивно», да? Может зайдешь и скажешь что они не правы? https://ru.stackoverflow.com/a/744625/18910

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Обязательно зайду в каждый форум и каждый вопрос на stackoverflow на всех языках мира чтобы проверить правы там или нет.

А ссылку на хорошую статью по теме читай пока не поймёшь, что она хорошая.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

Ну не хочешь отвечать на вопрос, флаг тебе в руки. Извини, но после такого - твои слова не имеют большого веса для меня. Разговор окончен. За статью спасибо.

FreakMurderer
() автор топика
Ответ на: комментарий от FreakMurderer

Действительно, читаю я тебя, невменяшка, и диву даюсь. Как можно быть таким тупым.

Ты балаболишь об инлайне, каких-то «размеров asm» и прочую ахинею. И даёшь ссылку на то, где нет никакого инлайна и ни о каких «размерах asm» не говорится.

Какой вывод мы можем сделать из этого? Ты либо болен, либо невменяем. Иного не дано.

rustonelove
()
Ответ на: комментарий от FreakMurderer

После такого заявления мои слова не имеют большого веса и для меня).

Sapienti sat.

dzidzitop ★★
()
Ответ на: комментарий от BceM_IIpuBeT

Проблема C++ в том, что есть куча готовых С/С++ библиотек, которые никто не будет переписывать.

Развивающиеся библиотеки постепенно перепишут.

DarkEld3r ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.