Skip to content

smart pointers #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ define clean_main_file
rm -f ${MAIN_FILE_BASE}.aux $(MAIN_FILE_DEPS:%.tex=%.aux)
rm -f ${MAIN_FILE_BASE}.log ${MAIN_FILE_BASE}.out
rm -f ${MAIN_FILE_BASE}.pdf ${MAIN_FILE_BASE}.toc
rm -f ${MAIN_FILE_BASE}-*.{asy,pdf,pre,tex}
rm -rf _minted-${MAIN_FILE_BASE}
endef

Expand All @@ -23,6 +24,7 @@ all: ${MAIN_FILE_BASE}.pdf ${HOW_TO_BASE}.pdf
${MAIN_FILE_BASE}.pdf: ${MAIN_FILE_BASE}.tex ${MAIN_FILE_DEPS}
$(call clean_main_file)
${TEX_CMD} --interaction=nonstopmode --halt-on-error --shell-escape ${MAIN_FILE_BASE}.tex
find -name '${MAIN_FILE_BASE}-*.asy' -print0 | xargs -0 asy
${TEX_CMD} --interaction=nonstopmode --halt-on-error --shell-escape ${MAIN_FILE_BASE}.tex

${HOW_TO_BASE}.pdf: ${HOW_TO_BASE}.tex
Expand Down
177 changes: 177 additions & 0 deletions asy_files/alloc.asy
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
settings.outformat = "pdf";

real linked = 221;
real shared = 572;
real intrusive = 214;
real unique = 239;
real linked_disp = 0;
real shared_disp = 2;
real intrusive_disp = 8;
real unique_disp = 6;real bench_width = 312.0;
real max_height = 572;

real arrow_offset = bench_width / 4.0 * 1.1;
real point_offset = arrow_offset * 2 / 3;
real linked_offset = arrow_offset + bench_width;
real shared_offset = arrow_offset + 2 * bench_width;
real intrusive_offset = arrow_offset + 3 * bench_width;
real unique_offset = arrow_offset + 4 * bench_width;
real label_offset = (shared_offset - linked_offset) / 2.0;

size(20cm,0);
draw((arrow_offset / 2, 0) -- (arrow_offset / 2, max_height),arrow=Arrow);

label(
scale(0.5) * ("" + string(linked) + ""),
(point_offset, linked),
black
);
label(
scale(0.5) * ("" + string(shared) + ""),
(point_offset, shared),
black
);
label(
scale(0.5) * ("" + string(intrusive) + ""),
(point_offset, intrusive),
black
);
label(
scale(0.5) * ("" + string(unique) + ""),
(point_offset, unique),
black
);
path lin = box((arrow_offset,0), (linked_offset,linked));
fill(lin, deepgreen);

path sha = box((linked_offset,0), (shared_offset,shared));
fill(sha, royalblue);

path intr = box((shared_offset,0), (intrusive_offset,intrusive));
fill(intr, magenta);

path uniq = box((intrusive_offset,0), (unique_offset,unique));
fill(uniq, heavyred);

real disp_eps = bench_width / 20.0;
draw(
(arrow_offset, linked)
-- (arrow_offset, linked + linked_disp)
-- (arrow_offset + disp_eps, linked + linked_disp)
-- (arrow_offset - disp_eps, linked + linked_disp)
-- (arrow_offset, linked + linked_disp)
-- (arrow_offset, linked - linked_disp)
-- (arrow_offset + disp_eps, linked - linked_disp)
-- (arrow_offset - disp_eps, linked - linked_disp)
-- (arrow_offset, linked - linked_disp)
, gray);
draw(
(linked_offset, shared)
-- (linked_offset, shared + shared_disp)
-- (linked_offset + disp_eps, shared + shared_disp)
-- (linked_offset - disp_eps, shared + shared_disp)
-- (linked_offset, shared + shared_disp)
-- (linked_offset, shared - shared_disp)
-- (linked_offset + disp_eps, shared - shared_disp)
-- (linked_offset - disp_eps, shared - shared_disp)
-- (linked_offset, shared - shared_disp)
, gray);
draw(
(shared_offset, intrusive)
-- (shared_offset, intrusive + intrusive_disp)
-- (shared_offset + disp_eps, intrusive + intrusive_disp)
-- (shared_offset - disp_eps, intrusive + intrusive_disp)
-- (shared_offset, intrusive + intrusive_disp)
-- (shared_offset, intrusive - intrusive_disp)
-- (shared_offset + disp_eps, intrusive - intrusive_disp)
-- (shared_offset - disp_eps, intrusive - intrusive_disp)
-- (shared_offset, intrusive - intrusive_disp)
, gray);
draw(
(intrusive_offset, unique)
-- (intrusive_offset, unique + unique_disp)
-- (intrusive_offset + disp_eps, unique + unique_disp)
-- (intrusive_offset - disp_eps, unique + unique_disp)
-- (intrusive_offset, unique + unique_disp)
-- (intrusive_offset, unique - unique_disp)
-- (intrusive_offset + disp_eps, unique - unique_disp)
-- (intrusive_offset - disp_eps, unique - unique_disp)
-- (intrusive_offset, unique - unique_disp)
, gray);

real label_delta = 0.05 * max(max(linked, shared), max(intrusive, unique));
label("linked\underline{\hspace{0.3cm}}ptr", (linked_offset - label_offset, linked + label_delta), black);
label("std::shared\underline{\hspace{0.3cm}}ptr", (shared_offset - label_offset, shared + label_delta), black);
label("boost::intruisive\underline{\hspace{0.3cm}}ptr", (intrusive_offset - label_offset, intrusive + label_delta), black);
label("std::unique\underline{\hspace{0.3cm}}ptr", (unique_offset - label_offset, unique + label_delta), black);
label("allocation/deallocation benchmark : ", (bench_width * 2.0, max_height * 1.1));
real linked = 178;
real shared = 357;
real intrusive = 195;
real unique = 178;
real linked_disp = 4;
real shared_disp = 9;
real intrusive_disp = 3;
real unique_disp = 4;path lin = box((arrow_offset,0), (linked_offset,linked));
fill(lin, black);

path sha = box((linked_offset,0), (shared_offset,shared));
fill(sha, black);

path intr = box((shared_offset,0), (intrusive_offset,intrusive));
fill(intr, black);

path uniq = box((intrusive_offset,0), (unique_offset,unique));
fill(uniq, black);

real disp_eps = bench_width / 20.0;
draw(
(arrow_offset, linked)
-- (arrow_offset, linked + linked_disp)
-- (arrow_offset + disp_eps, linked + linked_disp)
-- (arrow_offset - disp_eps, linked + linked_disp)
-- (arrow_offset, linked + linked_disp)
-- (arrow_offset, linked - linked_disp)
-- (arrow_offset + disp_eps, linked - linked_disp)
-- (arrow_offset - disp_eps, linked - linked_disp)
-- (arrow_offset, linked - linked_disp)
, gray);
draw(
(linked_offset, shared)
-- (linked_offset, shared + shared_disp)
-- (linked_offset + disp_eps, shared + shared_disp)
-- (linked_offset - disp_eps, shared + shared_disp)
-- (linked_offset, shared + shared_disp)
-- (linked_offset, shared - shared_disp)
-- (linked_offset + disp_eps, shared - shared_disp)
-- (linked_offset - disp_eps, shared - shared_disp)
-- (linked_offset, shared - shared_disp)
, gray);
draw(
(shared_offset, intrusive)
-- (shared_offset, intrusive + intrusive_disp)
-- (shared_offset + disp_eps, intrusive + intrusive_disp)
-- (shared_offset - disp_eps, intrusive + intrusive_disp)
-- (shared_offset, intrusive + intrusive_disp)
-- (shared_offset, intrusive - intrusive_disp)
-- (shared_offset + disp_eps, intrusive - intrusive_disp)
-- (shared_offset - disp_eps, intrusive - intrusive_disp)
-- (shared_offset, intrusive - intrusive_disp)
, gray);
draw(
(intrusive_offset, unique)
-- (intrusive_offset, unique + unique_disp)
-- (intrusive_offset + disp_eps, unique + unique_disp)
-- (intrusive_offset - disp_eps, unique + unique_disp)
-- (intrusive_offset, unique + unique_disp)
-- (intrusive_offset, unique - unique_disp)
-- (intrusive_offset + disp_eps, unique - unique_disp)
-- (intrusive_offset - disp_eps, unique - unique_disp)
-- (intrusive_offset, unique - unique_disp)
, gray);

real label_heigth=bench_width / 4.0;
label("heap allocation", (linked_offset - label_offset, label_heigth), white);
label("heap allocation", (shared_offset - label_offset, label_heigth), white);
label("heap allocation", (intrusive_offset - label_offset, label_heigth), white);
label("heap allocation", (unique_offset - label_offset, label_heigth), white);
107 changes: 107 additions & 0 deletions asy_files/copy.asy
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
settings.outformat = "pdf";

real linked = 12;
real shared = 48;
real intrusive = 10;
real unique = 0;
real linked_disp = 0;
real shared_disp = 0;
real intrusive_disp = 0;
real unique_disp = 0;real bench_width = 18.0;
real max_height = 48;

real arrow_offset = bench_width / 4.0 * 1.1;
real point_offset = arrow_offset * 2 / 3;
real linked_offset = arrow_offset + bench_width;
real shared_offset = arrow_offset + 2 * bench_width;
real intrusive_offset = arrow_offset + 3 * bench_width;
real unique_offset = arrow_offset + 4 * bench_width;
real label_offset = (shared_offset - linked_offset) / 2.0;

size(20cm,0);
draw((arrow_offset / 2, 0) -- (arrow_offset / 2, max_height),arrow=Arrow);

label(
scale(0.5) * ("" + string(linked) + ""),
(point_offset, linked),
black
);
label(
scale(0.5) * ("" + string(shared) + ""),
(point_offset, shared),
black
);
label(
scale(0.5) * ("" + string(intrusive) + ""),
(point_offset, intrusive),
black
);
label(
scale(0.5) * ("" + string(unique) + ""),
(point_offset, unique),
black
);
path lin = box((arrow_offset,0), (linked_offset,linked));
fill(lin, deepgreen);

path sha = box((linked_offset,0), (shared_offset,shared));
fill(sha, royalblue);

path intr = box((shared_offset,0), (intrusive_offset,intrusive));
fill(intr, magenta);

path uniq = box((intrusive_offset,0), (unique_offset,unique));
fill(uniq, heavyred);

real disp_eps = bench_width / 20.0;
draw(
(arrow_offset, linked)
-- (arrow_offset, linked + linked_disp)
-- (arrow_offset + disp_eps, linked + linked_disp)
-- (arrow_offset - disp_eps, linked + linked_disp)
-- (arrow_offset, linked + linked_disp)
-- (arrow_offset, linked - linked_disp)
-- (arrow_offset + disp_eps, linked - linked_disp)
-- (arrow_offset - disp_eps, linked - linked_disp)
-- (arrow_offset, linked - linked_disp)
, gray);
draw(
(linked_offset, shared)
-- (linked_offset, shared + shared_disp)
-- (linked_offset + disp_eps, shared + shared_disp)
-- (linked_offset - disp_eps, shared + shared_disp)
-- (linked_offset, shared + shared_disp)
-- (linked_offset, shared - shared_disp)
-- (linked_offset + disp_eps, shared - shared_disp)
-- (linked_offset - disp_eps, shared - shared_disp)
-- (linked_offset, shared - shared_disp)
, gray);
draw(
(shared_offset, intrusive)
-- (shared_offset, intrusive + intrusive_disp)
-- (shared_offset + disp_eps, intrusive + intrusive_disp)
-- (shared_offset - disp_eps, intrusive + intrusive_disp)
-- (shared_offset, intrusive + intrusive_disp)
-- (shared_offset, intrusive - intrusive_disp)
-- (shared_offset + disp_eps, intrusive - intrusive_disp)
-- (shared_offset - disp_eps, intrusive - intrusive_disp)
-- (shared_offset, intrusive - intrusive_disp)
, gray);
draw(
(intrusive_offset, unique)
-- (intrusive_offset, unique + unique_disp)
-- (intrusive_offset + disp_eps, unique + unique_disp)
-- (intrusive_offset - disp_eps, unique + unique_disp)
-- (intrusive_offset, unique + unique_disp)
-- (intrusive_offset, unique - unique_disp)
-- (intrusive_offset + disp_eps, unique - unique_disp)
-- (intrusive_offset - disp_eps, unique - unique_disp)
-- (intrusive_offset, unique - unique_disp)
, gray);

real label_delta = 0.05 * max(max(linked, shared), max(intrusive, unique));
label("linked\underline{\hspace{0.3cm}}ptr", (linked_offset - label_offset, linked + label_delta), black);
label("std::shared\underline{\hspace{0.3cm}}ptr", (shared_offset - label_offset, shared + label_delta), black);
label("boost::intruisive\underline{\hspace{0.3cm}}ptr", (intrusive_offset - label_offset, intrusive + label_delta), black);
label("std::unique\underline{\hspace{0.3cm}}ptr", (unique_offset - label_offset, unique + label_delta), black);
label("copy constructor benchmark : ", (bench_width * 2.0, max_height * 1.1));
Loading