472,982 Members | 1,770 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,982 software developers and data experts.

classes vs structs.

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

Feb 7 '06 #1
5 2841
Bi*************@gmail.com wrote:
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
--
Please remove capital As from my address when replying by mail
Feb 7 '06 #2
<Bi*************@gmail.com> wrote in message
news:11**********************@f14g2000cwb.googlegr oups.com...
| 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

Feb 7 '06 #3
On Tue, 7 Feb 2006 09:22:44 -0800, "Ed Weir \(ComCast\)"
<An**@Maus.duh> wrote:
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);
};

Feb 7 '06 #4
Roland Pibinger wrote:
On Tue, 7 Feb 2006 09:22:44 -0800, "Ed Weir \(ComCast\)"
<An**@Maus.duh> wrote:
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);


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
--
Please remove capital As from my address when replying by mail
Feb 7 '06 #5
On Tue, 07 Feb 2006 16:18:02 -0500, Victor Bazarov
<v.********@comAcast.net> wrote:
Roland Pibinger wrote:
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?


You are right!
Feb 7 '06 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Brad Tilley | last post by:
I don't understand classes very well... maybe some day. Is it just me or are they supposed to be difficult to understand? They make my head hurt. Anyway, because I don't understand classes well,...
14
by: Pratts | last post by:
I am a new one who have joined u plz try to help me bcoz i could not find ny sutiable answer foer this Question Qus>>why do we need classes when structures provide similar functionality??
4
by: Bill | last post by:
I would like to create a static array of classes (or structs) to be used in populating name/value pairs in various WebForm drop down list boxes, but am not quite sure of the construct (or rather to...
4
by: Christopher Ireland | last post by:
Hi -- I'm trying to find an example of a nested class implemented within the .NET Framework itself but without much success. I don't suppose that anybody knows of such an example off the top of...
2
by: Kiran A K | last post by:
Hi, can anyone give specific examples where structs are preferred to classes?
7
by: Markus Svilans | last post by:
Hi, What is the difference between having a struct with constructors and methods versus a class? In many C++ examples online I have seen code similar to this: struct Animal { Animal()
5
by: giddy | last post by:
hi , i'm a C / C# programmer .. have'nt done C++, in C# .. . object instances of classes ( TextBox txt = new TextBox();) are reference types. Structs on the other hand are value types. In...
29
by: Dom | last post by:
I'm really confused by the difference between a Struct and a Class? Sometimes, I want just a group of fields to go together. A Class without methods seems wrong, in that it carries too much...
19
by: desktop | last post by:
There is a lot of info on this topic on google. But in Bjarne Stroustrup 's book page 225 he writes: "The declaration of Date in the previous subsection (declared as a struct) provides a set of...
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
tracyyun
by: tracyyun | last post by:
Hello everyone, I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
2
by: giovanniandrean | last post by:
The energy model is structured as follows and uses excel sheets to give input data: 1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
4
NeoPa
by: NeoPa | last post by:
Hello everyone. I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report). I know it can be done by selecting :...
3
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be using a very simple database which has Form (clsForm) & Report (clsReport) classes that simply handle making the calling Form invisible until the Form, or all...
3
by: nia12 | last post by:
Hi there, I am very new to Access so apologies if any of this is obvious/not clear. I am creating a data collection tool for health care employees to complete. It consists of a number of...
0
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
4
by: GKJR | last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.