classes vs structs.

  • Thread starter Bilgehan.Balban
  • Start date
B

Bilgehan.Balban

Hi,

I am currently brushing up my c++ knowledge and I would like to ask you
about the differences between classes and C structs, in the
function/method perspective.

1) Is it correct to say that, a structure definition that includes
function pointers only defines the function prototypes to be used with
them, but not the actual implementations, whereas in C++, member
functions cannot be changed *unless* virtual functions are used, or the
original class is extended with a new one that defines
the same functions with different implementations?

2) Once defined, accessing member functions of a class in C++ has less
overhead thanks to name mangling, compared to the extra pointer
dereference overhead
in C structs with function pointers?

3) It is commonly said that virtual functions reduce performance.
AFAIK, the overhead of virtual functions compared to a function pointer
in a C struct is, only one extra pointer dereference and an addition.
E.g. one dereference to access vtab, and one offset addition and
dereference to access the function itself.

Is it even more than that, otherwise why does virtual functions have
such reputation to reduce performance where C structs with function
pointers are not that much better?

4) Also, isn't there the possibility to optimise the dereference in C
structs, at least if the function pointer is declared `const', i.e. not
to change after the initialisation. The compiler might just recognise
the const initialisation and replace it with a `branch' to the actual
function? Perhaps not a possible option with virtual functions due to
dynamic binding?

5) In a C struct on a 32-bit machine, the size of a struct is the sum
of all fields + maybe some padding; the function pointers take up as
much as a word. In C++ what is the size of a class, perhaps it excludes
sizes of member methods? Is it only the fields? What about static
storage? Does a static member count in every instance of the class? And
const members? Is it implementation defined where consts are stored? If
I wanted to memcpy a class, how much space should I spare? Perhaps it
is undefined behaviour if one manually copied a class and expected to
access its fields as normal?

Many thanks,
Bahadir
 
V

Victor Bazarov

I am currently brushing up my c++ knowledge and I would like to ask you
about the differences between classes and C structs, in the
function/method perspective.

1) Is it correct to say that, a structure definition that includes
function pointers only defines the function prototypes to be used with
them,
Huh?

> but not the actual implementations, whereas in C++, member
functions cannot be changed *unless* virtual functions are used, or the
original class is extended with a new one that defines
the same functions with different implementations?

No. Incorrect on several levels.
2) Once defined, accessing member functions of a class in C++ has less
overhead thanks to name mangling, compared to the extra pointer
dereference overhead
in C structs with function pointers?

Maybe. Only experimentation can actually show. And then after that, it
still needs to be proven to be of any importance.
3) It is commonly said that virtual functions reduce performance.
AFAIK, the overhead of virtual functions compared to a function pointer
in a C struct is, only one extra pointer dereference and an addition.
E.g. one dereference to access vtab, and one offset addition and
dereference to access the function itself.

I don't think there is dereference to access vtab. I don't think the
paragraph above makes sense.
Is it even more than that, otherwise why does virtual functions have
such reputation to reduce performance where C structs with function
pointers are not that much better?

Because some people like looking for flaws. Did you know that cars have
the reputation of killing their occupants?
4) Also, isn't there the possibility to optimise the dereference in C
structs, at least if the function pointer is declared `const', i.e. not
to change after the initialisation. The compiler might just recognise
the const initialisation and replace it with a `branch' to the actual
function? Perhaps not a possible option with virtual functions due to
dynamic binding?

Actually, if the call to any function even declared 'virtual' is made
non-polymorphically, there is no overhead.
5) In a C struct on a 32-bit machine, the size of a struct is the sum
of all fields + maybe some padding; the function pointers take up as
much as a word. In C++ what is the size of a class, perhaps it excludes
sizes of member methods?

Usually member functions do not contribute to the size of the object.
The most common implementation of virtual function mechanism adds one
pointer to an object of the class with any number of virtual functions.
> Is it only the fields? What about static
storage? Does a static member count in every instance of the class?
No.

> And
const members?

Depends on the members.
> Is it implementation defined where consts are stored? If
I wanted to memcpy a class, how much space should I spare? Perhaps it
is undefined behaviour if one manually copied a class and expected to
access its fields as normal?

I think you need to get and read "Inside the C++ Object Model" by Lippman.

V
 
E

Ed Weir \(ComCast\)

| Hi,
|
| I am currently brushing up my c++ knowledge and I would like to ask you
| about the differences between classes and C structs, in the
| function/method perspective.
|
| 1) Is it correct to say that, a structure definition that includes
| function pointers only defines the function prototypes to be used with
| them, but not the actual implementations, whereas in C++, member
| functions cannot be changed *unless* virtual functions are used, or the
| original class is extended with a new one that defines
| the same functions with different implementations?
|
| 2) Once defined, accessing member functions of a class in C++ has less
| overhead thanks to name mangling, compared to the extra pointer
| dereference overhead
| in C structs with function pointers?
|
| 3) It is commonly said that virtual functions reduce performance.
| AFAIK, the overhead of virtual functions compared to a function pointer
| in a C struct is, only one extra pointer dereference and an addition.
| E.g. one dereference to access vtab, and one offset addition and
| dereference to access the function itself.
|
| Is it even more than that, otherwise why does virtual functions have
| such reputation to reduce performance where C structs with function
| pointers are not that much better?
|
| 4) Also, isn't there the possibility to optimise the dereference in C
| structs, at least if the function pointer is declared `const', i.e. not
| to change after the initialisation. The compiler might just recognise
| the const initialisation and replace it with a `branch' to the actual
| function? Perhaps not a possible option with virtual functions due to
| dynamic binding?
|
| 5) In a C struct on a 32-bit machine, the size of a struct is the sum
| of all fields + maybe some padding; the function pointers take up as
| much as a word. In C++ what is the size of a class, perhaps it excludes
| sizes of member methods? Is it only the fields? What about static
| storage? Does a static member count in every instance of the class? And
| const members? Is it implementation defined where consts are stored? If
| I wanted to memcpy a class, how much space should I spare? Perhaps it
| is undefined behaviour if one manually copied a class and expected to
| access its fields as normal?
|
| Many thanks,
| Bahadir

There is very little difference between classes and structs in C++.
Anything you can do in a class you can do in a struct, and vice versa.
Structs are C baggage carried over to C++ and replaced by the class. The
only discernable difference is that ALL members of a struct are public by
default, and ALL members of a class are private by default. I still use the
typedef struct style in C++ to point out to the reader that I intend to use
this as a data container only, even though it might have some intelligence
built in about its data. Note that it is considered very bad style to
polymorph structs - you should use classes for that.

Cheers
 
R

Roland Pibinger

There is very little difference between classes and structs in C++.
Anything you can do in a class you can do in a struct, and vice versa.

The OP's question possibly is:

struct S {
void (*foo) (int);
};

vs.

class C1 {
public:
void foo (int);
};

vs.

class C2 {
public:
virtual void foo (int);
};
 
V

Victor Bazarov

Roland said:
The OP's question possibly is:

struct S {
void (*foo) (int);

Actually, you'd probably need to make it

void (*foo) (struct S*, int);

to match C++ functionality. After all, what if 'S' has data members?
};

vs.

class C1 {
public:
void foo (int);
};

vs.

class C2 {
public:
virtual void foo (int);
};

V
 
R

Roland Pibinger

Actually, you'd probably need to make it

void (*foo) (struct S*, int);

to match C++ functionality. After all, what if 'S' has data members?

You are right!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top