inline

Тема в разделе "Микроконтроллеры AVR", создана пользователем parovoZZ, 6 янв 2019.

  1. Asper Daffy

    Asper Daffy Иксперд

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

    Это Ваше мнение, и Вы вправе его иметь. К профессиональному программированию это отношения не имеет.
     
  2. SergeiL

    SergeiL Оракул Модератор

    Только что решил проверить.
    Что то не договаривают нам. :)
    Откуда разница в 172 байта?

    Скомпилировал два приведенных @Asper Daffy в #14 проекта:

    Первый:
    файл 1.ino:
    Код (C++):
    //////////////////////////////////
    //
    // ФАЙЛ kaka.ino
    //
    #include "1.h"

    void setup() {
        stupid();
    }

    void loop() {
        stupid();
    }
     
    ]

    файл 1.h:
    Код (C++):
    #ifndef    STUPID_H
    #define    STUPID_H

    static int stupid(void) {
        Serial.begin(9600);
        long i = 0;
        for (; i < 100; i++) {
            Serial.write(i);
        }
        for (; i < 200; i++) {
            Serial.write(i);
        }
        for (; i < 300; i++) {
            Serial.write(i);
        }
        for (; i < 100500; i++) {
            Serial.write(i);
        }
        return Serial.read();
    }

    #endif    //    STUPID_H
    Второй:
    из второго убрал статик в определении функции, он там некорректен.
    (Видимо отсюда и нарастало).

    Файл 2.ino:
    Код (C++):
    //////////////////////////////////
    //
    // ФАЙЛ kaka.ino
    //
    extern int stupid(void);

    void setup() {
        stupid();
    }

    void loop() {
        stupid();
    }
     
    файл fnc.cpp:
    Код (C++):
    #ifndef    STUPID_H
    #define    STUPID_H

    #include <arduino.h>

    int stupid(void) {
        Serial.begin(9600);
        long i = 0;
        for (; i < 100; i++) {
            Serial.write(i);
        }
        for (; i < 200; i++) {
            Serial.write(i);
        }
        for (; i < 300; i++) {
            Serial.write(i);
        }
        for (; i < 100500; i++) {
            Serial.write(i);
        }
        return Serial.read();
    }

    #endif    //    STUPID_H
    После компиляции размер кода идентичен:
    inline.png
    Что то у Вас не так ;)
     

    Вложения:

    • 1.zip
      Размер файла:
      646 байт
      Просмотров:
      233
    • 2.zip
      Размер файла:
      663 байт
      Просмотров:
      225
  3. Asper Daffy

    Asper Daffy Иксперд

    Это у Вас не так. В моих примерах по ТРИ файла, а не по два. Что Вы там поизменяли и поубирали я не знаю и разбираться не хочу.

    Я уже Вам сказал. Вы ничего не поняли из моего объяснения, значит я не сумел объяснить, но больше пытаться не буду - надоело.
     
  4. SergeiL

    SergeiL Оракул Модератор

    Да я то все прекрасно понял, как вы этого добились, только к начальному вопросу, то даже и не за уши притянуто. В начальном вопросе было:
    Вы создаете .h-файл с определением статической функции.
    подключаете его к двум файлам в одном проекте. Конечно, для каждого будет создана своя копия.
    И к чему это, доказать это:
    Часто вы видите статические функции в проектах?

    Разговор был, разбивать проект на отдельные файлы или нет, и на что это влияет.
     
  5. Asper Daffy

    Asper Daffy Иксперд

    Да,как же достало-то! Разговор был на самом деле
    Только теперь он говорит, что имел в виду только инлайны. Вы похоже оба говорите одно, а имеете в виду другое. Давайте, наконец, прекратим. Я бы уже прекратил отвечать, если бы не считал это невежливым.
    Гораздо чаще, чем нестатитчекие. примерно штук пять статических на одну нестатическую. Правда, в профессиональных проектах. Это нормальный стиль профессиональной разработки - не расширять область видимости без необходимости.
     
  6. SergeiL

    SergeiL Оракул Модератор

    :)
     
  7. parovoZZ

    parovoZZ Гуру

    НЕТ.
     
  8. parovoZZ

    parovoZZ Гуру

    я ваще не понимаю, на кой черт сюда static притянули?
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Ну, и не понимаете и не понимаете, значит я не сумел объяснить.

    Простите. мужики, но я больше не отвечаю в этой теме, устал. В другой раз ещё встретимся.
     
  10. parovoZZ

    parovoZZ Гуру

    Разговор вообще не с этого начался.
    Проект многофайловый - это недвижимое условие. Второе условие - работа с каждым модулем и внешним устройством в своем файле. Так вот я в одном из таких файлов определяю функцию, которая тупо из одного регистра копирует значение в другой. На это уходит 1 такт. На вызов этой функции уходит 3 такта, на возврат 4 такта. Итого накладных расходов - 7 тактов. Вопрос - что делать? Ответ - встраивать вызываемую функцию в вызывающий её код. ГЛАВНЫЙ ВОПРОС всей темы - как это сделать не нарушая условий задачи? В файле *.с определить её с квалификатором inline extern, в заголовочном без него? В main.c include заголовка.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Если это вопрос, то пожалуйста уточните его, потому как "имел в виду" уже в печёнках сидит.

    Вы эту функцию собираетесь из нескольких файлов вызывать? Или из одного?
     
  12. SergeiL

    SergeiL Оракул Модератор

    Как удобнее, по коду - без разницы.
    Это есть на первой странице.
     
  13. parovoZZ

    parovoZZ Гуру

    И так и этак.
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Это разные вещи и ответы на Ваш вопрос будут разными. Так что отвечайте, а то я Вам отвечу и опять начнётся "я имел в виду ..."
     
  15. parovoZZ

    parovoZZ Гуру

    Давай начнем с одного. Я пишу в файле ADC.c
    Код (C++):
    uint8_t Get_Data (void)
    {
        return ADCH;
    }
    и хочу, чтобы компилятор эту функцию встроил в код в main.c
     
  16. volatile uint8_t Get_Data (void)
    Иначе хрень.
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Никак!!!

    Я уже писал в этом топике несколько раз, поймите, Вы наконец. Компилятор всегда компилирует 1 (прописью - один) файл и ничего при этом не знает о других. Когда компилятор компилирует файл main.c - они ничего не знает о файле ADC.c и никак не может в него залезть и вытащить из него код Вашей функции.

    Всё. что видит компилятор - это файл, который он компилирует и то, что в него включается при помощи #include (я надеюсь, Вы не собираетесь ADC.c включать инклудом в main.c ???)
     
  18. parovoZZ

    parovoZZ Гуру

    Почему? Компилятор может не вызывать функцию, а подставлять запомненное значение из РОН? Но это же бред. Я с таким не сталкивался.
     
  19. parovoZZ

    parovoZZ Гуру

    Разумеется:
    Код (C++):
    #include "ADC.h"
     
  20. Может. И передвинуть функцию может.