2014-01-31 1 views
0

Хотя глядя на someone's code я был поражен способ представления данных, которые, в контексте C, казалось мне странным:данных в C: Linked Структуры против больших структур

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

s_entities -> s_scene_object -> s_sphere 
s_entities -> s_scene_object -> s_plane 
s_entities -> s_pointlight 

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

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

Мне кажется, как остатки привычек ООП.

+0

Если вы не показать нам структуры, ваш вопрос не может быть действительно ответил. Как сказал Фред Брукс: «Покажите мне свои блок-схемы и сокрыте свои столы, и я буду продолжать мистифицировать. Покажите мне свои столы, и мне обычно не нужны ваши блок-схемы, они будут очевидны». –

+0

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

ответ

2

Вы говорите «остатки привычек ООП», как будто это что-то, что явно не в порядке на C. Я бы сказал, что вы ошибаетесь, в C. есть довольно большие коллекции очень сильно объектно-ориентированного кода. Это работает.

Объектно-ориентированный подход - это способ организации и моделирования вещей, он не привязан к языкам программирования. C достаточно низкоуровневый, что вы можете делать в нем всевозможные парадигмы программирования; вам часто придется реализовать большую часть парадигмы самостоятельно, так как есть небольшая поддержка от языка, но OO довольно прямолинейна.

Это не очень понятно из вашего примера, но более типичный способ моделирования таких вещей, как на C, заключается в введении более базовой структуры данных (суперкласс) внутри более специализированной, используя тот факт, что первый член в C struct находится по смещению 0 от самой структуры:

typedef struct { 
    float x, y, z; 
} Shape; 

typedef struct { 
    Shape shape; 
    float radius; 
} Sphere; 
+0

, не делает ли этот компонент данных «сложнее» доступ? Также сложнее инициализировать? –

+0

@chixuclub не указатели делают это еще сложнее? – immibis

+0

+1 для привычек ООП не плохое на C. Это совершенно правильно, и это, безусловно, помогает управлять сложностью в крупных проектах. –