Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098

Static члены класса

05.01.2016, 08:43. Показов 9433. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

есть класс, например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
point
{ 
public:
    float x;
    float y;
 
    static distance (point A, point B) 
    {
        float dx = A.x - B.x;
        float dy = A.y - B.y;
        return sqrt(dx*dx + dy*dy);
    } 
}
static получается совместно разделяемым, те будет выделена память под distance один раз и все объекты point будут этой функцией пользоваться?
Например:
C++
1
2
3
4
point A;
point B;
cout << A.distance(A,B);
cout << B.distance(A,B);// будет использоваться одна функ в 1-ом и 2-ом случае, те одна область памяти?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2016, 08:43
Ответы с готовыми решениями:

класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции)
Помогите пожалйуста с реализацией программы... Реализовать класс «Строка» (данные-члены класса – строчка (указатель на массив, ...

Static члены классов
Доббрый день. Хочу решить следующую задачу: посчитать количество сравнений, которое делает qsort. Для этого, как мне видится можно...

Static член класса
Всем привет! Подскажите, пожалуйста, почему так писать нельзя: В хедере объявляю статический метод: public: explicit...

70
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2016, 13:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Kastaneda Посмотреть сообщение
разобраться как классы хранятся (хранятся ли?) в памяти, а также объекты, члены, ф-ции члены. Что происходит при создании объекта, что при разрушении и т.д.
__________________
А я бы посоветовал сначала уяснить:
-какие задачи решают объекты;
-как данные задачи решаются без объектов;
-зачем нужны статические переменные.
То есть, я хочу сказать, что не понимая на уровне алгоритмических определений вроде: "Это такая штука которая делает зашебись..." не стоит вникать в конструктив: "Это такая штуковина, которая устроена так-то и так-то". Не будет интересно и обучение станет мучением. Бесполезным, причем, что уж совсем неприемлемо.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 16:32
Цитата Сообщение от IGPIGP Посмотреть сообщение
Супер класс, это моя отсебятина в терминологии и никакого отношения к наследованию не имеет.
ваше объяснение больше запутывает, чем объясняет.

Цитата Сообщение от Kastaneda Посмотреть сообщение
A *a = nullptr;* a->f();
Пример полностью рабочий, т.к. никакого разыменования указателя не происходит.
здесь UB, поскольку происходит разыменовывание указателя.

более того:

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct example
{
    static void foo(){}
};
 
int main()
{
    example::foo(); // ok
 
    example* p = nullptr;
    p->foo(); //UB
}
разыменовывание происходит даже при попытке доступа к статической-функции-члену,
несмотря на то, что экземпляр для этого не нужен,
и само по себе разыменовывание в этом случае не имеет смысла.

а все потому, что в стандарте сказано:
при доступе по указателю, сначала разыменовываем, потом думаем:

5.2.5 Class member access

2.
For the first option (dot) the first expression shall have complete class type. For the second option (arrow)
the first expression shall have pointer to complete class type. The expression E1->E2 is converted to the
equivalent form (*(E1)).E2;

для тех, кто до сих пор не въехал в природу
статических/не статических функций членов объясняю:


вот есть обычные "свободные функции" :

C++
1
2
3
4
5
6
7
#include <iostream>
void foo() {  std::cout <<"привет мир!\n"; }
 
int main()
{
    foo();
}
ну так вот статические-функции-члены - это абсолютно точно такие же "свободные функции",
просто они объявлены в пространстве имени класса,
автоматически являются другом класса,
и на них распространяется действие модификатора доступа public/protected/private
никаких других синтаксических отличий не существует.

в техническом смысле,
статические-функции-члены имеют абсолютно точно такую же природу,
как и самые обычные свободные.

пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
void foo() {  std::cout <<"привет мир!\n"; }
 
struct example
{
    static void foo() {  std::cout <<"привет мир!\n"; }
};
 
 
 
int main()
{
    foo();  // обычная свободная
 
    example::foo(); // статический член
}
как видите - никакой разницы.
просто нужно явно указывать имя класса при доступе к статической-функции-члену

в чем киллер фича?
ну например, нам нужна обычная свободная функция,
но при этом мы хотим запретить вызывать её снаружи.
вызывать её имеют только экземпляры класса.

это можно было бы сделать вот так:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
struct example
{
     // экземпляры класса могут вызвать статическую функцию член
    example() { foo(); } 
private:
 
    // снаружи уже вызвать нельзя
    static void foo() {  std::cout <<"привет мир!\n"; }
};
 
int main()
{
    example::foo(); // error
 
    example object; // ok
 
}
на самом деле различных применений для статических-функций-членов достаточно много.
я не буду подробно заостряться на этом.

разберем лучше не статические-функции-члены.


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

и существуют они в программе так же в единственном экземпляре.


сначала предлагаю задуматься над единством экземпляра функции:

функция содержит исполняемый код.
она реализует некоторый алгоритм обработки чего либо.

рассмотрим пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
struct example
{
    void foo()const {  std::cout <<"привет мир!\n"; v = 33; }
    int v = 10;
};
 
int main()
{
    example obj1, obj2; 
    obj1.foo();
    obj2.foo();
}
обратите внимание: у нас есть два объекта.
каждый хранит свое состояние: содержимое переменной v.
значение данных-членов может быть уникально
для разных экземпляров класса.

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


теперь смотрите на функцию-член foo:

она абсолютно одинаковая для любого количества объектов.
ну а зачем тогда каждому объекту хранить ещё и её?

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


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

а как определяется на какой?


смотрим пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct example { int v; };
 
void foo(example& e) { e.v=10; }
 
int main()
{
    example obj1,obj2;
 
    // вместо этого:  obj1.foo();
    // делаем так:
 
    foo(obj1); //<--- воздействуем на obj1
 
    foo(obj2); //<--- воздействуем на obj2
 
 
    // итого: компилятор генерирует код подстановки
    // obj.foo(); он заменяет на foo(obj);
    // где foo - функция член, которая на самом деле принимает 
    // один, невидимый для программиста аргумент:
    // указатель на объект, на который должна воздействовать
    // функция-член.
}

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

http://rextester.com/RPP97113
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
// так как функции-члены на самом деле точно такие же "свободные функции"
// то технически, мы можем запустить функцию-член, не как метод класса
// а как самую обычную свободную функцию
// проиллюстрируем это:
 
 
struct Example
{
    // мы будем запускатьэтот метод не как метод, 
    // а как обычную свободную функцию
    void foo(int) { cout<<"Example::foo(int);\n"; }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    typedef 
        void(*Free)(Example*, int);
    typedef 
        void(Example::*Method)(int);
    
    //для того, что бы запустить метод, как свободную функцию
    //нужно выполнить преобразования метода в свободную функцию
    
    Method m= &Example::foo;
    
    //для этого возьмем адрес функции-члена таким образом,
    //что бы компилятор забыл изначальный тип функции-члена
    //это позволит обойти защиту компилятора при некорректном 
    //с точки зрения компилятора преобразовании типов функции-члена к функции
    void* proxy = (void*)&m;
 
 
    //теперь извлекаем объект обратно, преобразовывая его тип к типу функции
    Free f = *((Free*)proxy);
    
    Example ex;
    
    
    //теперь, если наша теория верна, мы можем запустить функцию, 
    //передав первым аргументом тот самый "не видимый" параметр this
    //а следом все прочие аргуметы
    f(&ex,10);  
}
/зы внимательный читатель верно обратил внимание,
что для того, что бы провернуть трюк,
пришлось обмануть компилятор,
и обойти его защиту.

"не спроста ведь компилятор пытался не допустить этого!" -
верно подумал внимательный читатель, и не напрасно.

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

существуют различные "соглашения о вызовах"
(загуглите сами)
но даже они не являются панацеей.
компиляторы вольны здесь проворачивать любую магию.

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


в общем, рассматривайте пример-иллюстрацию,
как поясняющую "суть вещей",

но не вздумайте бездумно кастить методы к свободным функциям"
спички детям не игрушки.
3
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2016, 17:18
Цитата Сообщение от hoggy Посмотреть сообщение
ваше объяснение больше запутывает, чем объясняет.
А вы ещё раз прочтите. Или лучше не читайте. То есть, это ваше дело.
А моё дело в том, что поднятая тема ценна сама по себе. Что касается ТС как такового, то ему само слово static ещё не в прок. А вопрос может быть интересен многим, вот я и выложил свою интерпретацию. Кому-то может и понравится.
ТСу это пока бессмысленно объяснять. Вот пост где ему всё ясно без пояснений:
Static члены класса
Тут нечего добавить.
Ваши размышления о том, что функции они функции и есть, кстати, к теме вообще не относятся, но вас же это не смущает? Вы входите в тему и всё рассказываете. Под занавес.
Ну и что? Имеете полное право.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 18:23
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваши размышления о том, что функции они функции и есть, кстати, к теме вообще не относятся
ещё как относится. конкретно к первопосту ТС.
на самом деле мне знакомы сомнения-размышлизмы ТС,
потому что когда то я и сам чем то подобным озадачивался.

статические члены класса воспринимаются,
как "собственность всего класса",

в то время, как не статические члены,
как "собственность конкретного объекта".

из-за чего возникает иллюзия,
что функции-члены существуют где то в объекте класса.

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

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

я лишь дополнил ответ господина Kastaneda,
раскрыв подноготную материала.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Вот пост где ему всё ясно без пояснений:
Static члены класса
ну если господин Kastaneda уподобляется Страуструпу,
выдавая столь же точные, сколь и лаконичные,
столь и бесполезные для новичка ответы,
то приведенный вами ответ - это выдержка из обучающего материала.

эта тема возникла не сегодня.
и на самом деле изначально я не хотел сюда писать.

потому что мой изначальный ответ был бы в духе:
"взять в руки букварь,
и просто прочитать тему про статические члены класса не судьба?
или обязательно нужно скопипастить сюда целый абзац из какой нибудь книги?"

но это было бы не конструктивно.

и все таки, я написал дополнение к ответу господина Kastaneda
раскрыв сабж с технической точки зрения
(в букварях он раскрывается с точки зрения синтаксиса языка),
в расчете, что это окончательно расставит все точки над "и".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2016, 18:55
Цитата Сообщение от hoggy Посмотреть сообщение
ну если господин Kastaneda уподобляется Страуструпу,
выдавая столь же точные, сколь и лаконичные,
сколько и бесполезные для новичка ответы,
Почему бесполезные? Он нормально ответил как раз. Цитата которую вы не прочли это цитата из поста TC. Давайте-ка я ещё раз дам ссылку:
Static члены класса
в надежде что вы прочтёте этот пост. В нём ТС приводит цитату и говорит, что в ней ему всё ясно без комментариев. Он там цитирует и Kastaneda, в самом начале, но это не важно.
Цитата Сообщение от hoggy Посмотреть сообщение
я лишь дополнил ответ господина Kastaneda,
Я не стал бы вам отвечать если бы вы не прокомментировали меня походя и односложно. А вот это, действительно интересно:
Цитата Сообщение от hoggy Посмотреть сообщение
потому что когда то я и сам чем то подобным озадачивался.
статические члены класса воспринимаются, как "собственность всего класса", в то время, как не статические члены, как "собственность конкретного объекта", из-за чего возникает иллюзия, что функции-члены существуют где то в объекте класса.
Тут не спорю. Сейчас модно начинать обучение сразу с ОП. Не представляя структур и структурного программирования, многие начинающие считают, что где-то в объекте есть и фигурные скобки. Тут я не имею конкретно вас ввиду.
Но это - фаза, возрастное... и со временем оно проходит. Однако, есть ещё более тяжёлые заблуждения. Серьёзные (и не только с виду) люди говорят о статических членах, отваживаясь давать им нравственную оценку. Причем модно давать отрицательную. Слышны возгласы о нарушении инкапсуляции, замусоривании пространства класса, тем что экземпляру не принадлежит и пр. Н у то есть в классе де не должно быть общих "штурпаков", которые валяются под ногами как глобальные грабли. Ведь никто не знает кто последний и почему их модифицировал и т.д. и т.п.
Я считаю, что давать оценки "хорошо-плохо" вещам, которые прочно вошли в жизнь надо осторожно. Мы же не детализируем класс до бесконечности. Степень детализации ограничивает поставленная задача. Вот и ходядят у нас студенты MyStudent имея только имя, фамилию, курс и ещё пару-тройку вещей. Вместо горячего завтрака и приличного жилья. Так и вышестоящие сущности не могут уходить вверх до бесконечности. Где-то нужно остановиться и в месте разрыва с реальностью сразу появятся "штурпаки", но висят они над головами. Как окорока и колбасы в подвале. И тут либо программист научится их принимать и любить, либо будет вечно биться о них головой.
То есть ситуация всегда найдёт разрешение.
Думаю, сказать об этом было уместно.
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
06.01.2016, 19:07
Цитата Сообщение от Kastaneda Посмотреть сообщение
А как то, что я написал связано с тем, что ты показал?
Я осознал свою ошибку. Посчитал, что можно будет так же обратиться к статической через this->memberName;.

Но и твой пример я не нахожу поясняющим суть статика. Т.к. если он работает, то он только покажет, что
ОС будет сердится лишь в тех случаях, когда программа будет совсем наглеть, лезть руками в чужие
карманы. Я это вижу как-то так.
Кажется, кто-то тут писал, что этот пример UB. Я не знаю что такое UB, но думаю, что ничего хорошего.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 19:28
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему бесполезные?
потому что ТС не уловил мысль из #2.
о чем красноречиво продемонстрировал #4

Цитата Сообщение от IGPIGP Посмотреть сообщение
Давайте-ка я ещё раз дам ссылку:
не очевидно зачем вы мне её ещё раз приводите,
и как это коррелирует с вашим предыдущим предложением.

Цитата Сообщение от IGPIGP Посмотреть сообщение
В нём ТС приводит цитату и говорит, что в ней ему всё ясно без комментариев.
дык, это же он сам и накопал.
сам себе на свой вопрос ответил.

очень мудрое решение:
взять, да и почитать моральную обучающую литературу.

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

Добавлено через 7 минут
Цитата Сообщение от Kirik516 Посмотреть сообщение
Я не знаю что такое UB
undefined behaviour.

неопределенное поведение.

произойти может все, что угодно.
и что именно - никто не знает,
и не дает никаких гарантий.

теоретически, мы можем получить стабильно работающую программу.
а можем и открытку по почте от компилятора,
или программу, которая будет работать в зависимости от фазы луны.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.01.2016, 19:42
Цитата Сообщение от hoggy Посмотреть сообщение
она абсолютно одинаковая для любого количества объектов.
ну а зачем тогда каждому объекту хранить ещё и её?
Ну, если мы создаем каким-то объектом в его функции-члене статическую переменную, то логично было бы ожидать, что она принадлежит только этому объекту, а на деле всем объектам класса. Здесь абстракция нестатической функции-члена имеет дырку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
///////////////////////////////////////////////////////////////////////////////
struct  T_t
{
    //-------------------------------------------------------------------------
    int     &   f()
    {
        static  int     n   =   0;
        return  n;
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        std::cout   <<  "\n\nn = ";
        T_t     t;
        std::cin    >>  t.f();
 
        T_t     tt;
        std::cout   <<  tt.f();
    }//for
}
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2016, 19:49
SergioO,
Для воистину крепкого понимания во что превращаются функции, код, переменные, статические, виртуальные.
Нужно увидеть фразу "С/С++ - это кроссплатформенный асемблер".
И загуглить и понять какую-то информацию по теме "структура программы на ассемблере" и увидеть что-то о сегментах.
При этом не нужно становиться программистом ассемблера, а нужно получить представление "что куда и зачем".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 19:52
Цитата Сообщение от Mr.X Посмотреть сообщение
если мы создаем каким-то объектом в его функции-члене статическую переменную, то логично было бы ожидать, что она принадлежит только этому объекту
я не вижу в вашем суждении никакой логики.

я вижу статический объект,
который существует в пространстве имени функции.

а поскольку природа у всех функций одинаковая,
то технически ничто мне не мешает сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
// вообще не имеет никакого отношения к классам
int& foo() { static int v; return v; } 
 
int main()
{
    // какому именно экземпляру какого класса в данном случае 
    // прикажите поиметь в собственность локальный статик?
   std::cout << foo() << '\n';
}
более того, ключевое слово "static" у меня ассоциируется с прочими статическими объектами.
то есть, это объекты, чьё время жизни - до конца программы.

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

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


ваша же логика мне живо напомнило Елену Сагалаеву,
которая в своем блоге рекомендует не использовать локальные статики,
потому что однажды она уже подорвалась на мине,
следуя вашей нелогичной логике.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.01.2016, 20:00
Nosey, вы путаете стандарт и реализацию. Разработчики компилятора накропают ровно то, что написано в стандарте, хоть черта лысого. Надо просто стандарт читать. Хотя некоторым трудно представить абстракции стандарта, и они предпочитают мыслить их "в железе". Некоторые, например на полном серьезе считают, что указатель на член класса - это смещение адреса.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
06.01.2016, 20:12
Цитата Сообщение от Mr.X Посмотреть сообщение
Некоторые, например на полном серьезе считают, что указатель на член класса - это смещение адреса.
Просветите, что это?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2016, 20:17
Mr.X,
Сегодня всё в С++ проще считать за абстракции.
Мой комментарий был к тому, чтобы заметить разделённые области кода и данных, о том что код это последовательность команд процессору, если после этого у кого-то возникнет мысль что функция хранится в объекте - то лучше этому человеку забыть о с++ )
И да, стандарт плюсов асемблер не заменит, но без понимания во что превращается код из этого стандарта, гораздо сложнее осознать и запомнить почему сделано именно так.
И выбирая между двух зол "указатель на член класса - это смещение адреса" и "метод класса хранится в объекте" я выберу первое
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
06.01.2016, 20:20  [ТС]
Nosey, это интересно пожалуй. я примерно об этом и думал. а ведь при компиляции какой-то ассемблерный файл получается и можно модифицируя его посмотреть? + есть же какие-то "просмотровщики" памяти? те, если написать простую прогу, откомпилировать, потом посмотреть asm затем глянуть в память (как там все это уместилось). есть же такая возможность? желательно что-нибудь под ubuntu
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2016, 20:24
Цитата Сообщение от hoggy Посмотреть сообщение
дык, это же он сам и накопал.
сам себе на свой вопрос ответил.
очень мудрое решение:
взять, да и почитать моральную обучающую литературу.
Вот! Прочли значит. Осталось прочесть до :
Цитата Сообщение от SergioO Посмотреть сообщение
я вообще не понимаю зачем этот статик. в случае библиотек понятно когда они статические, а в классах зачем? на простом примере можете пояснить?
разрыв в 10 ночных часов. Материал - перечисление тем которые требуют серьёзной работы. Комментарий - ясно без комментариев:
Цитата Сообщение от SergioO Посмотреть сообщение
По-моему, даже комментировать нечего - все предельно ясно.
нарыть и понять это не одно и то же и это ясно из дальнейшего.
hoggy, вы часто не видите логики или не улавливаете мысль не находите?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2016, 20:25
Цитата Сообщение от SergioO Посмотреть сообщение
треть asm затем глянуть в память (как там все это уместилось). есть же такая возможность? желательно что-нибудь под ubuntu
Code
1
gcc -s -o path/to/output/file.asm path/to/src/file.cpp
Главное минимум подключений библиотек.
И к исследуемой функции добавлять
Code
1
 __attribute__ ((noinline))
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.01.2016, 20:35
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Просветите, что это?
Где?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.01.2016, 20:43
Цитата Сообщение от hoggy Посмотреть сообщение
разыменовывание происходит даже при попытке доступа к статической-функции-члену,
несмотря на то, что экземпляр для этого не нужен,
и само по себе разыменовывание в этом случае не имеет смысла.
а все потому, что в стандарте сказано:
при доступе по указателю, сначала разыменовываем, потом думаем
Не все так просто. Есть причины, по которым вызов статической функции через нулевой указатель, вполне можно считать well-defined. На эту тему уже ломались копья.
http://stackoverflow.com/quest... ll-pointer
http://stackoverflow.com/quest... fined-beha (последние абзацы)
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
06.01.2016, 20:46
Цитата Сообщение от hoggy Посмотреть сообщение
более того, ключевое слово "static" у меня ассоциируется с прочими статическими объектами.
то есть, это объекты, чьё время жизни - до конца программы.
для меня в первую очередь очень логично,
что это просто объект,
способный выжить и сохранить состояние между вызовами функций.
Ну, время жизни и приватность никак не связаны, и эти сочетания можно по-разному в языках реализовывать.
Вы рассматриваете классы и объекты как вещи в себе и Страуструпе, однако сам Страуструп создавал их для того, чтобы моделировать объекты реального мира, и если на них с этой точки зрения посмотреть, то логики мы в них увидим меньше.
Пусть имеется класс Мужик, и у этого класса есть нестатическая функция Рука. Логично, что если Петя делает своей Рукой долговременную (статическую) заначку, то это будет одна заначка, а если Вася сделает своей Рукой
статическую заначку, то это будет другая заначка. Но в С++ совсем не так. Там говорят - слишком жирно каждому Мужику по отдельной Руке. Рука будет одна общая, но в каждый момент будет действовать в интересах того, кто ее вызвал. Ежели ей дают команду почесать тестикулы, то чешет строго тому, на кого работает. Но с заначками начинаются проблемы. Вася общей рукой сделал заначку, а Петя этой же рукой - извлек ее же.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2016, 20:49
Цитата Сообщение от IGPIGP Посмотреть сообщение
разрыв в 10 ночных часов. Материал - перечисление тем которые требуют серьёзной работы. Комментарий - ясно без комментариев:
вы сказать то что хотели?

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
вы часто не видите логики или не улавливаете мысль не находите?
большинство людей на моей памяти в состоянии связать два предложения так,
что бы между ними была логическая связь.
но не все.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2016, 20:49

Static-член класса
Подскажите пожалуйста в чем проблема, не получается инициализировать static-член указатель на объекты класса. counter инициализируется...

Static поля класса
объясните нубу, вот имею я такой код на С# class WebResponse { public static string GET(string Url, string Data) ...

Static в описании метода класса
всем привет. что такое static в описании метода класса или самого класса. что такое статичный метод? что такое не статичный метод?

Статические методы класса (static)
Доброго времени суток! Читаю &quot;Решение сложных задач С++ - Саттер&quot;, у него есть такая задача: вы хотите написать шаблон класса MyClass,...

Инициализация static члена класса
Добрый вечер! Есть класс, в нём в private реализован ещё один + это всё шаблоны. Во вложенном классе есть static указатель на переменную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru