I am a bit confused by the alignment of a struct in D. I have some C++ code that I am translating into D.

Here is the C++:

#include <fstream>
#include <iostream>
#include <string.h>

struct TradesIdx
{
  char symbol[10];
  int tdate;
  int begrec;
  int endrec;
}__attribute__((packed));

struct TradesBin
{
  int ttim;
  int prc;
  int siz;
  short int g127;
  short int corr;
  char cond[2];
  char ex[1];
}__attribute__((packed));

int main()
{
std::string infile("/Users/tyler/BFE/Measures/data/201212/T201212A.IDX"); std::ifstream fin(infile.c_str(), std::ios::in | std::ios::binary);

std::cout << "Size of TradesIdx = " << sizeof(TradesIdx) << std::endl; std::cout << "Size of TradesBin = " << sizeof(TradesBin) << std::endl;

  return 0;
}

Which when run gives the values:

Size of TradesIdx = 22
Size of TradesBin = 19

Here is the D code:

import std.stdio : writefln;
import std.stream;

align(1) struct TradesIdx
{
  char[10] symbol;
  int tdate;
  int begrec;
  int endrec;
}

align(1) struct TradesBin
{
  int ttim;
  int prc;
  int siz;
  short g127;
  short corr;
  char[2] cond;
  char[1] ex;
}

void main()
{
string infile = "/Users/tyler/BFE/Measures/data/201212/T201212A.IDX";
  auto fidx = new File(infile, FileMode.In);

  writefln("Size of TradesIdx = %s", TradesIdx.sizeof);
  writefln("Size of TradesBin = %s", TradesBin.sizeof);
}

Which when run gives:

Size of TradesIdx = 24
Size of TradesBin = 19

Why the difference? What is weird is that the two codes used to give the same answers. Has the alignment value of structs changed recently?

Reply via email to