By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,264 Members | 1,271 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,264 IT Pros & Developers. It's quick & easy.

POD initialization

P: n/a
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<doublepins;
};

struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl())
{
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0. However, I am not sure why the variable
'npinset' does not get a default value of 0. In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double= {
_M_impl = {
<std::allocator<double>= {
<__gnu_cxx::new_allocator<double>= {<No data fields>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
>::_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.

Thanks for your time.

Jun 19 '07 #1
Share this Question
Share on Google+
4 Replies


P: n/a
On 2007-06-19 22:36, pallav wrote:
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<doublepins;
};

struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl())
{
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0. However, I am not sure why the variable
'npinset' does not get a default value of 0. In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double= {
_M_impl = {
<std::allocator<double>= {
<__gnu_cxx::new_allocator<double>= {<No data fields>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
>>::_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.
I have not read you code so I don't know where you put your PODs but
they are only initialized to 0 if they are static or global (and
probably one more that I missed) but not on the stack or heap.

--
Erik Wikström
Jun 19 '07 #2

P: n/a
pallav wrote:
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<doublepins;
};
The struct above is not a POD-struct. It contains a 'vector',
which is non-POD. When an object of this struct is default-
initialised, each member is default-initialised. For the 'pins'
vector it means to default-initialise (invoke the constructor),
for built-ins it means to NOT initialise.
>
struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
I don't see this class anywhere.
: dc(new DelayCircuitImpl())
{
If you look at 'dc->wltable' _right_here_, what would it be?
I would say that both 'slope' and 'npinset' would have garbage.
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0.
No.
However, I am not sure why the variable
'npinset' does not get a default value of 0.
It's not supposed to. Add a constructor to your 'DelayCircuitImpl'
_and_ to 'DelayWireLoadTable'.
In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double= {
_M_impl = {
<std::allocator<double>= {
<__gnu_cxx::new_allocator<double>= {<No data fields>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
>>:_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.
How about this:
------------------------------
#include <vector>
struct A {
int a;
std::vector<intvi;
};

#include <iostream>
struct B {
A *pa;
B() : pa(new A()) {
std::cout << pa->a << ' ' << pa->vi.size() << std::endl;
}
};

int main() {
B b;
}
-----------------------------
It should print something non-zero and then 0.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 20 '07 #3

P: n/a

pallav wrote in message...
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());
#define DELAY_VALUE_NOT_GIVEN -7654321.0
typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime {
double rise;
double fall;
DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay {
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;
PinDelay();
PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable {
double slope;
unsigned int npinset;
std::vector<doublepins;
// 'npinset' isn't used in the code you showed. Either remove it, or init
it.
DelayWireLoadTable() : slope(0.0), npinset(0){}
// or, see below...
};

struct DelayCircuitImpl {
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall
(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload
(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl()) {
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
// OR here, if you don't want a Ctor (for POD struct):
dc->wltable.npinset = 0;
}
[snip]

--
Bob R
POVrookie
Jun 20 '07 #4

P: n/a
On Jun 19, 8:26 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
The struct above is not a POD-struct. It contains a 'vector',
which is non-POD. When an object of this struct is default-
initialised, each member is default-initialised. For the 'pins'
vector it means to default-initialise (invoke the constructor),
for built-ins it means to NOT initialise.
If you look at 'dc->wltable' _right_here_, what would it be?
I would say that both 'slope' and 'npinset' would have garbage.
Yes I see it now. Since it is allocating from the heap it is not
initialized and hence contains garbage.
>
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}
Since the struct contain POD (plain old data), I would think they
should be initialized to 0.

No.

It's not supposed to. Add a constructor to your 'DelayCircuitImpl'
_and_ to 'DelayWireLoadTable'.
Right I understand now.
>

How about this:
------------------------------
#include <vector>
struct A {
int a;
std::vector<intvi;

};

#include <iostream>
struct B {
A *pa;
B() : pa(new A()) {
std::cout << pa->a << ' ' << pa->vi.size() << std::endl;
}

};

int main() {
B b;}

-----------------------------
It should print something non-zero and then 0.
Yes, it does.

Many thanks for the time/help everybody.
Jun 20 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.