Books & Articles

Home Blog Talks Books & Articles Training & Consulting

Prev
Up
Next

On the
blog
RSS feed March 25: We Have FDIS! (Trip Report: March 2011 C++ Standards Meeting)
March 24:
Book on PPL Is Now Available
January 14: Interview on Channel 9
December 31: 2010: Cyberpunk World

Herb is the author of the bestselling and highly-acclaimed Exceptional C++ books, coauthor of the landmark C++ Coding Standards, and author of hundreds of articles in print and online media. Besides these, he has contributed to other books and articles.

Books

Exceptional C++ 
H. Sutter, Addison-Wesley, 2000, ISBN 0-201-61562-2.

More C++ Gems (major contributor) 
R. Martin (ed.), SIGS Books / Cambridge University Press, 2000, ISBN 0-521-78618-5.

More Exceptional C++ 
H. Sutter, Addison-Wesley, 2002, ISBN 0-201-70434-X.

Exceptional C++ Style
H. Sutter, Addison-Wesley, 2004, ISBN 0-201-76042-8.

C++ Coding Standards 
H. Sutter and A. Alexandrescu, Addison-Wesley, 2005, ISBN 0-321-11358-6.

Guru of the Week

Over 80 thought-provoking articles about C++ design and programming have been published on this website and on the newsgroup comp.lang.c++.moderated. A complete web archive of past problems and solutions is available here.

Articles, Columns, and Papers (most are available online below)

Over 200 more in-depth articles and papers about object-oriented software development and C++ design and programming have been published in C/C++ Users Journal, C++ Report, Dr. Dobb's Journal, Java Report, Visual C++ Developer's Journal, and other magazines, or as C++ standards committee papers.

bullet

Updated and expanded versions of many of these articles appear in Herb's books Exceptional C++ and More Exceptional C++. Those have been tagged below with and respectively. See the books for the updated material.

bullet

"Effective Concurrency" columns are identified as "EC #nn".

bullet

"Sutter's Mill" columns are identified as "Mill #nn".

bullet

"The New C++" columns are identified as "TNC++ #nn".

bullet

"Conversations" columns (coauthored with Jim Hyslop) are identified as "Conv #nn". See also the Conversations Archive for a separate listing showing just Conversations articles and summaries.

2010
EC #33

Effective Concurrency: Know When to Use an Active Object Instead of a Mutex
Dr. Dobb's Report
, September 2010.

From the article: "Let’s say that your program has a shared log file object. The log file is likely to be a popular object; lots of different threads must be able to write to the file; and to avoid corruption, we need to ensure that only one thread may be writing to the file at any given time. Quick: How would you serialize access to the log file? Before reading on, please think about the question and pencil in some pseudocode to vet your design. More importantly, especially if you think this is an easy question with an easy answer, try to think of at least two completely different ways to satisfy the problem requirements, and jot down a bullet list of the advantages and disadvantages they trade off. Ready? Then let’s begin."

EC #32

Effective Concurrency: Prefer Using Futures or Callbacks to Communicate Asynchronous Results
Dr. Dobb's Report
, August 2010.

From the article: "This time, we’ll answer the following questions: How should we express return values and out parameters from an asynchronous function, including an active object method? How should we give back multiple partial results, such as partial computations or even just “percent done” progress information? Which mechanisms are suited to callers that want to “pull” results, as opposed to having the callee “push” the results back proactively? And how can “pull” be converted to “push” when we need it? Let’s dig in…"

EC #31

Effective Concurrency: Prefer Using Active Objects Instead of Naked Threads
Dr. Dobb's Report
, June 2010.

From the article: "Active objects dramatically improve our ability to reason about our thread’s code and operation by giving us higher-level abstractions and idioms that raise the semantic level of our program and let us express our intent more directly. As with all good patterns, we also get better vocabulary to talk about our design. Note that active objects aren’t a novelty: UML and various libraries have provided support for active classes. Some actor-based languages already have variations of this pattern baked into the language itself; but fortunately, we aren’t limited to using only such languages to get the benefits of active objects. This article will show how to implement the pattern, including a reusable helper to automate the common parts, in any of the popular mainstream languages and threading environments, including C++, C#/.NET, Java, and C/Pthreads."

EC #30

Effective Concurrency: Associate Mutexes with Data to Prevent Races
Dr. Dobb's Report
, May 2010.

From the article: "The holy grail of the Consistency pillar is to make a concurrent program race-free and deadlock-free by construction. … This article shows how to achieve the "race-free by construction" grail via sound engineering, with automatic and deterministic race identification at test time based on code coverage alone."

EC #29

Effective Concurrency: Prefer Futures to Baked-In "Async APIs"
Dr. Dobb's Report
, January 2010.

From the article: "When designing concurrent APIs, separate "what" from "how" Let’s say you have an existing synchronous API function [calledDoSomething]... Because DoSomething could take a long time to execute (whether it keeps a CPU core busy or not), and might be independent of other work the caller is doing, naturally the caller might want to execute DoSomething asynchronously. … The question is, how should we enable that? There is a simple and correct answer, but because many interfaces have opted for a more complex answer let’s consider that one first."

2009
EC #28

Effective Concurrency: Prefer Structured Lifetimes - Local, Nested, Bounded, Deterministic
Dr. Dobb's Report
, November 2009.

From the article: "Where possible, prefer structured lifetimes: ones that are local, nested, bounded, and deterministic. This is true no matter what kind of lifetime we’re considering, including object lifetimes, thread or task lifetimes, lock lifetimes, or any other kind. ..."

EC #27

Effective Concurrency: Avoid Exposing Concurrency – Hide It Inside Synchronous Methods
Dr. Dobb's Report
, October 2009.

From the article: "You have a mass of existing code and want to add concurrency. Where do you start? Let’s say you need to migrate existing code to take advantage of concurrent execution or scale on parallel hardware. In that case, you’ll probably find yourself in one of these two common situations, which are actually more similar than different: Migrating an application: You’re an application developer, and you want to migrate your existing synchronous application to be able to benefit from concurrency. Migrating a library or framework: You’re a developer on a team that produces a library or framework used by other teams or external customers, and you want to let the library take advantage of concurrency on behalf of the application without requiring application code rewrites. You have a mountain of opportunities and obstacles before you. Where do you start?  ..."

EC #26

Effective Concurrency: Design for Manycore Systems
Dr. Dobb's Report
, August 2009.

From the article: "Why worry about “manycore” today? Dual- and quad-core computers are obviously here to stay for mainstream desktops and notebooks. But do we really need to think about "many-core" systems if we’re building a typical mainstream application right now? I find that, to many developers, "many-core" systems still feel fairly remote, and not an immediate issue to think about as they’re working on their current product. This column is about why it’s time right now for most of us to think about systems with lots of cores. In short: Software is the (only) gating factor; as that gate falls, hardware parallelism is coming more and sooner than many people yet believe. ..."

EC #25

Effective Concurrency: The Power of "In Progress"
Dr. Dobb's Report
, July 2009.

From the article: "Let’s look at the question from another angle, suggested by my colleague Terry Crowley: Instead of viewing partially-updated state with in-progress work as an ‘unfortunate’ special case to remember and recover from, what if we simply embrace it as the normal case? ..."

EC #24

Effective Concurrency: Break Up and Interleave Work to Keep Threads Responsive
Dr. Dobb's Report
, June 2009.

From the article: "What happens when this thread must remain responsive to new incoming messages that have to be handled quickly, even when we’re in the middle of servicing an earlier lower-priority message that may take a long time to process? If all the messages must be handled on this same thread, then we have a problem. Fortunately, we also have two good solutions..."

EC #23

Effective Concurrency: Eliminate False Sharing
Dr. Dobb's Report
, May 2009.

From the article: "... A number of readers have asked for more information and examples on where false sharing arises and how to deal with it. … This month, let’s consider a concrete example that shows an algorithm in extremis due to false sharing distress, how to use tools to analyze the problem, and the two coding techniques we can use to eliminate false sharing trouble…"

EC #22 Use Thread Pools Correctly: Keep Tasks Short and Nonblocking
Dr. Dobb's Report, April 2009.

From the article: "... But the thread pool is a leaky abstraction. That is, the pool hides a lot of details from us, but to use it effectively we do need to be aware of some things a pool does under the covers so that we can avoid inadvertently hitting performance and correctness pitfalls. Here’s the summary up front: 1. Tasks should be small, but not too small, otherwise performance overheads will dominate. 2. Tasks should avoid blocking (waiting idly for other events, including inbound messages or contested locks), otherwise the pool won’t consistently utilize the hardware well — and, in the extreme worst case, the pool could even deadlock. Let’s see why. …"

EC #21 Use Threads Correctly = Isolation + Asynchronous Messages
Dr. Dobb's Report, March 2009.

From the article: "Explicit threads are undisciplined. They need some structure to keep them in line. In this column, we're going to see what that structure is, as we motivate and illustrate best practices for using threads -- techniques that will make our concurrent code easier to write correctly and to reason about with confidence. ..."

EC #20 Sharing Is the Root of All Contention
Dr. Dobb's Report, February 2009.

From the article: "... In this article, I’ll deliberately focus most of the examples on one important case, namely mutable (writable) shared objects in memory, which are an inherent bottleneck to scalability on multicore systems. But please don’t lose sight of the key point, namely that "sharing causes contention" is a general principle that is not limited to shared memory or even to computing. The Inherent Costs of Sharing Here’s the issue in one sentence: Sharing fundamentally requires waiting and demands answers to expensive questions. …"

EC #19 volatile vs. volatile
Dr. Dobb's Journal, 34(2), February 2009.

From the article: "What does the volatile keyword mean? How should you use it? Confusingly, there are two common answers, because depending on the language you use volatile supports one or the other of two different programming techniques: lock-free programming, and dealing with ‘unusual’ memory. Adding to the confusion, these two different uses have overlapping requirements and impose overlapping restrictions, which makes them appear more similar than they are. Let’s define and understand them clearly, and see how to spell them correctly in C, C++, Java and C# — and not always as volatile. ..."

EC #18 Measuring Parallel Performance: Optimizing a Concurrent Queue
Dr. Dobb's Journal, 34(1), January 2009.

From the article: "How would you write a fast, internally synchronized queue, one that callers can use without any explicit external locking or other synchronization? Let us count the ways…or four of them, at least, and compare their performance. We’ll start with a baseline program and then successively apply three optimization techniques, each time stopping to measure each change’s relative performance for queue items of different sizes to see how much each trick really bought us.  …"

2008
EC #17 Understanding Parallel Performance
Dr. Dobb's Journal, 33(12), December 2008.

From the article: "Let’s say that we’ve slickly written our code to apply divide-and-conquer algorithms and concurrent data structures and parallel traversals and all our other cool tricks that make our code wonderfully scalable in theory. Question: How do we know how well we’ve actually succeeded? Do we really know, or did we just try a couple of tests on a quad-core that looked reasonable and call it good? What key factors must we measure to understand our code’s performance, and answer not only whether our code scales, but quantify how well under different circumstances and workloads? What costs of concurrency do we have to take into account? …"

EC #16 Writing a Generalized Concurrent Queue
Dr. Dobb's Journal, 33(11), November 2008.

From the article: "Last month, I showed code for a lock-free queue that supported the limited case of exactly two threads—one producer, and one consumer. That’s useful, but maybe not as exciting now that our first rush of lock-free coding glee has worn off. This month, let’s tackle the general problem of supporting multiple producers and multiple consumers with as much concurrency as possible. The code in this article uses four main design techniques: …"

EC #15 Writing Lock-Free Code: A Corrected Queue
Dr. Dobb's Journal, 33(10), October 2008.

From the article: "As we saw last month, lock-free coding is hard even for experts. There, I dissected a published lock-free queue implementation and examined why the code was quite broken. This month, let’s see how to do it right. …"

EC #14 Lock-Free Code: A False Sense of Security
Dr. Dobb's Journal, 33(9), September 2008.

From the article: "[Lock-free code is] hard even for experts. It’s easy to write lock-free code that appears to work, but it’s very difficult to write lock-free code that is correct and performs well. Even good magazines and refereed journals have published a substantial amount of lock-free code that was actually broken in subtle ways and needed correction. To illustrate, let’s dissect some peer-reviewed lock-free code that was published here in DDJ just two months ago …"

EC #13 The Many Faces of Deadlock
Dr. Dobb's Journal, 33(8), August 2008.

From the article: "… That’s the classic deadlock example from college. Of course, two isn’t a magic number. An improved definition of deadlock is: 'When N threads enter a locking cycle where each tries to take a lock the next already holds.' 'But wait,' someone might say. 'I once had a deadlock just like the code you just showed, but it didn’t involve locks at all—it involved messages.' …"

 Hungarian Notation Is Clearly (Good|Bad)
Sutter's Mill, July 2008.

From the article: "A commenter asked: 'thread_local X tlsX; ?? Herb, I hope you aren’t backtracking on Hungarian Notation now that you work for Microsoft. Say it aint so!' It ain’t so. ..."

 Trip Report: June 2008 ISO C++ Standards Meeting
Sutter's Mill, July 2008.

An update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

EC #12Choose Concurrency-Friendly Data Structures
Dr. Dobb's Journal, 33(7), July 2008.

From the article: "What is a high-performance data structure? To answer that question, we're used to applying normal considerations like Big-Oh complexity, and memory overhead, locality, and traversal order. All of those apply to both sequential and concurrent software. But in concurrent code, we need to consider two additional things to help us pick a data structure that is also sufficiently concurrency-friendly..."

 Type Inference vs. Static/Dynamic Typing
Sutter's Mill, June 2008.

From the article: "It’s worth making a stronger demarcation among: (a) type inference, which you can do in any language; (b) static vs. dynamic typing, which is completely orthogonal but all too often confused with inference; and (c) strong vs. weak typing, which is mostly orthogonal (e.g., C is statically typed because every variable has a statically known actual type, but also weakly typed because of its casts)."

EC #11Maximize Locality, Minimize Contention
Dr. Dobb's Journal, 33(6), June 2008.

From the article: "Want to kill your parallel application's scalability? Easy: Just add a dash of contention. ... Locality is no longer just about fitting well into cache and RAM, but also about avoiding scalability busters by keeping tightly coupled data physically close together and separately used data far, far apart."

EC #10Interrupt Politely
Dr. Dobb's Journal, 33(5), May 2008.

From the article: "How do you stop a thread or task you longer need or want? Table 1 summarizes the four main ways, and how they are supported on several major platforms. Let's consider them in turn..."

EC #9Super Linearity and the Bigger Machine
Dr. Dobb's Journal, 33(4), April 2008.

From the article: "This month, we'll ... consider how to achieve superlinear speedups by harnessing more resources—quite literally, running on a bigger machine without any change in the hardware."

 Trip Report: February/March 2008 ISO C++ Standards Meeting
Sutter's Mill, March 2008.

An update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

EC #8Going Superlinear
Dr. Dobb's Journal, 33(3), March 2008.

From the article: "Under what circumstances can we use P cores to do work more than P times faster? There are two main ways to enter that rarefied realm: 1. Do disproportionately less work. 2. Harness disproportionately more resources. ..."

EC #7Break Amdahl's Law!
Dr. Dobb's Journal, 33(2), February 2008.

From the article: "Back in 1967, Gene Amdahl famously pointed out what seemed like a fundamental limit to how fast you can make your concurrent code... If Amdahl's Game is rigged, well then, to paraphrase a line from the movie WarGames: The only way to win is not to play."

EC #6Use Lock Hierarchies to Avoid Deadlock
Dr. Dobb's Journal, 33(1), January 2008.

From the article: "... The only way to eliminate such a potential deadlock is to make sure that all mutexes ever held at the same time are acquired in a consistent order. But how can we ensure this in a way that will be both usable and correct? For example, we could try to figure out which groups of mutexes might ever be held at the same time, and then try to define pairwise ordering rules that cover each possible combination. ... We can do better by directly exploiting the knowledge we already have about the structure of the program to regularize the mess and make it understandable."

2007
EC #5Avoid Calling Unknown Code While Inside a Critical Section
Dr. Dobb's Journal, 32(12), December 2007.

From the article: "Don't walk blindly into a deadly embrace... Our world is built on modular, composable software. We routinely expect that we don't need to know about the internal implementation details of a library or plug-in to be able to use it correctly. The problem is that locks, and most other kinds of synchronization we use today, are not modular or composable. That is, given two separately authored modules, each of which is provably correct but uses a lock or similar synchronization internally, we generally can't combine them and know that the result is still correct and will not deadlock. There are only two ways to combine such a pair of lock-using modules safely: ..."

 Trip Report: October 2007 ISO C++ Standards Meeting
Sutter's Mill, November 2007.

An update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

EC #4Apply Critical Sections Consistently
Dr. Dobb's Journal, 32(11), November 2007.

From the article: "The critical section is our One True Tool for guaranteeing mutual exclusion on mutable shared variables. ... [but] must be applied consistently, and with the intended meanings. A program must ensure that every use of a mutable shared object is properly protected using exactly one of these mechanisms at any given point in its lifetime. Chaos can erupt if code tries to avoid or invert these meanings (e.g., trying to abuse taking a lock or reading an atomic variable as a "critical section exit" operation; see Example 3), or tries to use inconsistent synchronization techniques at the same time."

EC #3Use Critical Sections (Preferably Locks) to Eliminate Races
Dr. Dobb's Journal, 32(10), October 2007.

From the article: "Everyone knows the basics of how to use locks:

  mut.lock(); // acquire lock on x
  ... read/write x ...
  mut.unlock(); // release lock on x

"But why do locks, lock-free styles, and other synchronization techniques work at all, never mind interoperate well with each other and with aggressive optimizers that transform and reorder your program to make it run faster? Because every synchronization technique you've ever heard of must express, and every optimization that may ever be performed must respect and uphold, the common fundamental concept of a critical section."

 Trip Report: July 2007 ISO C++ Standards Meeting
Sutter's Mill, September 2007.

An update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

EC #2How Much Scalability Do You Have or Need?
Dr. Dobb's Journal, 32(9), September 2007.

From the article: "In your application, how many independent pieces of work are ready to run at any given time? Put another way, how many cores (or hardware threads, or nodes) can your code harness to get its answers faster? And when should the answers to these questions not be 'as many as possible'?"

 The Pit and the Pendulum
Sutter's Mill, August 2007.

From the article: "Don't fall into the pit of thinking there's no pendulum, or that the pendulum can be nailed to one side. ... Neither the center nor the edge is going to go away. We're in an expanding computing universe: The question is not whether one will replace the other, but what balance they will be in at a given point. "

EC #1The Pillars of Concurrency,
Dr. Dobb's Journal, 32(8), August 2007.

From the article: "Have you ever talked with another developer about concurrency, and felt as though you were somehow speaking completely different languages? If so, you're not alone. You can see the confusion in our vocabulary..."

 Name Lookup Uses the Static Type
Sutter's Mill, July 2007.

From the article: "I recently received the following question in email ... The difference in behavior has nothing to do with the complexity of the inheritance hierarchy or with vtables or thunking. Rather, it has to do with name lookup (in this case, finding "Method_of_A") which in turn has to do whether the static type of the object has the function you want, or whether the compiler has to look further (into base classes) to find the name."

 Trip Report: April 2007 ISO C++ Standards Meeting
Sutter's Mill, May 2007.

An update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

2006
 Guest Editorial: It's (Not) All Been Done,
Dr. Dobb's Journal, 31(9), September 2006.

Have you ever felt that all the cool stuff was already done back in the 1950s and 1960s, back when electronic computers were new? All the cool new toys of the past decade were invented then, including garbage collection (1958), objects (1967), and generic types (1967). Incidentally, 1967 was a banner year; it also saw the first design meetings for the ARPANET. What made these things "new" again more recently is that they have been popularized by being brought, with great effort and greater reward, smack dab into the mainstream of languages and tools.

This is a wonderful time to be a software engineer because it's a new world again: For the first time in the history of computing, mainstream computers are not von Neumann machines and never will be again—they are parallel. We have largely succeeded with the quest to put a computer in every home and purse; now we're effectively going to put a Cray into every den and pocket. That makes this is a time of enormous opportunity, as usual along with a great deal of work, as our industry now undertakes to do for parallel programming what we have already done for generic types, objects, and garbage collection.

 A Design Rationale for C++/CLI,
February 2005.
This paper is an all-in-one-place summary of the design goals and rationale for C++/CLI, and captures a small but representative sample of the experience gained by a number of C++ experts who have worked on defining bindings between C++ and CLI. The paper considers the requirements and several major design alternatives for a number of specific features, chosen as representative examples that cover most CLI feature areas: 1. CLI types (e.g., ref class, value class): Why new type categories are needed, and considerations for choosing the right defaults for CLI types. 2. CLI type features (e.g., property): Why new abstractions are needed for some CLI features. 3. CLI heap (e.g., ^, gcnew): Why to add a new declarator and keyword. 4. CLI generics (generic): Why the new genericity feature is distinct from templates, but compatible and highly integrated with templates. 5. C++ features (e.g., template, const): Why and how these are made to work on CLI types. The paper also includes extensive answers to some frequently asked questions about C++/CLI.
2005
Mill #37Pointers and Iterators: Off the Deep End,
C/C++ Users Journal, 23(11), November 2005.
Don’t even create invalid pointers or iterators; they are undefined and nonportable. Do get a checked STL, turn all the checking on, and use it daily and automatically at least in test builds. You’ll be glad you did.
 

Delegating Constructors (revision 2) (with Francis Glassborow),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1895 = ANSI/NCITS J16 05-0155, October 2005.

 

A Modest Proposal: Fixing ADL (revision 1),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1893 = ANSI/NCITS J16 05-0153, October 2005.

 Software and the Concurrency Revolution,
ACM Queue, September 2005.
The concurrency revolution is primarily a software revolution. Soon all new machines will be multicore, and the difficult problem is programming this hardware so that mainstream applications benefit from the continued exponential growth in CPU performance.
TNC #14Trip Report: April 2005,
C/C++ Users Journal, 23(8), August 2005..
News and views from the spring 2005 C and C++ standards meetings in Lillehammer, Norway. The big news: The C++ evolution working group has set this fall is the deadline for new proposals, after which we'll be heads-down trying to finish most of the technical work next ISO C++ standard by 2007 so that the new standard can be published in 2009. (It would be nice if the "x" in "C++0x" didn't need to be a hexadecimal digit…) This column also summarizes the main changes you can expect to C++ and why they matter to you.

Conv #60

Graceful Exits (with Jim Hyslop),
C/C++ Users Journal, 23(7), July 2005.
When you detect an error or invalid state in a function, what’s the best way to handle it: return an error code, throw an exception, or call assert()? Well, as is frequently the case, the answer is “that depends...”

 

A Modest Proposal: Fixing ADL,

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1792 = ANSI/NCITS J16 05-0052, May 2005.

Conv #59

Logically Shallow Views (with Jim Hyslop),
C/C++ Users Journal, 23(5), May 2005.
const is logical, not physical; shallow, not deep; and a promise on the view, not necessarily a promise on the object.

Conv #58

Polymorphic Exceptions (with Jim Hyslop),
C/C++ Users Journal, 23(4), April 2005.
What do you do when you want to throw an exception, the exception object is a derived class, but all you have is a reference to the base class?

Mill #36The Trouble With Locks,
C/C++ Users Journal, 23(3), March 2005.
Many people believe they understand how to write correct concurrent programs, but may not yet fully comprehend just how subtle it really is. This article focuses on the mainstream status quo approach to concurrency, lock-based programming. We will see why lock-based programming is difficult even for experts to use correctly, and why it’s fundamentally flawed for building large programs.

Conv #57

Implicit Virtual (with Jim Hyslop),
C/C++ Users Journal, 23(3), March 2005.
One person’s “bug” is another person’s “feature.” This month, we consider the implicit nature of virtual and how it can produce cool or unsettling results in your code, depending on your point of view.

 The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software,
Dr. Dobb's Journal, 30(3), March 2005.
The biggest sea change in software development since the OO revolution is knocking at the door, and its name is Concurrency.
Mill #35The Concurrency Revolution,
C/C++ Users Journal, 23(2), February 2005.
The biggest sea change in software development since the OO revolution is knocking at the door, and its name is Concurrency. [Note: This is an abbreviated version of the March Dr. Dobb's article.]

Conv #56

Order, Order (with Jim Hyslop),
C/C++ Users Journal, 23(2), February 2005.
Getting the order right for a standard associative container can take a bit of thought.

TNC #13Trip Report: October 2004,
C/C++ Users Journal, 23(1), January 2005.
This month, an update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

Conv #55

Tagged Unions (with Jim Hyslop),
C/C++ Users Journal, 23(1), January 2005.
Some of our C heritage is slim and fast—and fragile—in the name of performance. Unions are such a beast.

2004
Mill #34Compatibilities,
C/C++ Users Journal, 22(12), December 2004.
C++, the real world, and link and binary compatibility.

Conv #54

Alias (with Jim Hyslop),
C/C++ Users Journal, 22(12), December 2004.
When are two variables really two variables? When the real problem can be aliasing, don’t be too quick to blame macros…

Mill #33How to Provide (or Avoid) Points of Customization in Templates,
C/C++ Users Journal, 22(11), November 2004.
This column, drawn from one of the Items in Herb's and Andrei's new book C++ Coding Standards, is about how to program intentionally when providing and when using template libraries.

Conv #53

Adaptations (with Jim Hyslop),
C/C++ Users Journal, 22(11), November 2004.
Say you're using multiple inheritance and each of two base classes has a virtual function with the same name. You want to provide separate overrides for each function, to be called in the context of the specific override. How do you do it?

 

Strongly Typed Enums (revision 1) (with David Miller),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1719 = ANSI/NCITS J16 04-0159, October 2004.

 Book excerpt from C++ Coding Standards,
C/C++ Users Journal, 22(10), October 2004.
The goal of the new book C++ Coding Standards is to summarize tried-and-true guidelines in concise one- and two-page Items, with extensive references to further details in the C++ literature (there are nearly 200 citations of specific sections in Stroustrup's books alone). For this excerpt, we've selected the book's opening Item and two others that appear later in the book.
Conv #52Friendly Nesting (with Jim Hyslop),
C/C++ Users Journal, 22(10), October 2004.
This month, we consider why nested classes should (but don't) have access to the members of their enclosing class, and what the committee is doing about it.
Mill #32"Just Enough" Thread Safety,
C/C++ Users Journal, 22(9), September 2004.
This article is about when "good enough" is exactly what you want, and why it really is good enough.

Conv #51

Typedefs and Iterators: If you've Got 'Em, Use 'Em (with Jim Hyslop),
C/C++ Users Journal, 22(9), September 2004.
Typedefs do more than just reduce clutter and save keystrokes; they can help smooth the transition when requirements change. Iterators are an even more powerful tool for implementation hiding and reducing coupling due to container choices. But both techniques can only help if you actually use them!

Mill #31When and How to Use Exceptions,
C/C++ Users Journal, 22(8), August 2004.
A clear, objective, and measurable answer to the question: "When, for what, and how should you use exceptions?"

Conv #50

Collecting Shared Objects (with Jim Hyslop),
C/C++ Users Journal, 22(8), August 2004.
Avoid using bald pointers. Avoid using auto_ptr, instead use shared_ptr which is widely available and being added to the standard library. Store only values and smart pointers in containers; specifically, use either a container<value_type> to hold objects directly by value and ensure that they really do have value semantics, or else use a container< some_refcounted_smart_ptr<any_type> >, preferably a container< shared_ptr<any_type> >. If you don't, you'll wish you had.

Mill #30Function Types,
C/C++ Users Journal, 22(7), July 2004.
Function types are a little-known but widely-supported and useful feature in C++. Using typedefs of function types offers an alternative to macros with a different set of advantages and drawbacks.

Conv #49

Delete This Thread? (with Jim Hyslop),
C/C++ Users Journal, 22(7), July 2004.
Are self-deleting objects a good idea? Could they be inherently thread-unsafe? As with many thread-safety issues, a careful analysis is needed, and in this case will reveal there is no problem but only a design decision. Bob, alas, is not known for careful analysis…

TNC++ #12

Trip Report: March 2004,
C/C++ Users Journal, 22(6), June 2004.
This month, an update on the most recent C++ standards meeting, and the progress on the C++0x standard language and library.

Conv #48

Getting Abstractions (with Jim Hyslop),
C/C++ Users Journal, 22(6), June 2004.
Are getter and setter functions inherently evil, or are they just a little misunderstood?

TNC++ #11

Much Ado About Nothing: A (True) Null Pointer Value for C++,
C/C++ Users Journal, 22(5), May 2004.
What is the type of 0? In C and C++, there is more than one answer. And that’s a problem, because it means that when you want to point to nothing, sometimes plain old 0 and NULL just won’t do…

Conv #47

Enumerations (with Jim Hyslop),
C/C++ Users Journal, 22(5), May 2004.
As Stroustrup himself once wrote: “C enumerations constitute a curiously half-baked concept.” And C++ enumerations are only slightly better…

TNC++ #10

Trips Report: October-December 2003,
C/C++ Users Journal, 22(4), April 2004.
An update on the most recent C, C++, and C++/CLI standards meetings, and the progress on the C++0x standard language and library. Convergence, cooperation, goodwill -- oh my! It wasn't long ago when there was some tension between C and C++, as each language, fiercely independent, appeared determined to remain free to pursue its own path and dreams. As the poet said, 'The times, they are a-changin'...'

Conv #46

Using Me (with Jim Hyslop),
C/C++ Users Journal, 22(4), April 2004.
The using directive is a contentious feature -- more contentious, in fact, than it needs to be. If you choose to use it, this article examines some rules and guidelines around its use
.

 

Delegating Constructors (revision 1) (with Francis Glassborow),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1618 = ANSI/NCITS J16 04-0058, March 2004.

Conv #45

Im-Paired Programming (with Jim Hyslop),
C/C++ Users Journal, 22(3), March 2004.
std::pair can make your life easier. But as with many things, moderation is the key: excessive use can lead to unmanageable code.

 

A Name For the Null Pointer: nullptr (revision 2) (with Bjarne Stroustrup),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1601 = ANSI/NCITS J16 04-0041, February 2004.

 

Delegating Constructors (with Francis Glassborow),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1581 = ANSI/NCITS J16 04-0021, February 2004.

 

Strongly Typed Enums (with David Miller),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1579 = ANSI/NCITS J16 04-0019, February 2004.

Conv #44

Virtually Misbehavin' (with Jim Hyslop),
C/C++ Users Journal, 22(2), February 2004.
C++ implicit overriding at work.

Conv #43

Of Many Things (with Jim Hyslop),
C/C++ Users Journal, 22(1), January 2004.
“The time has come,” the Walrus said, “to talk of many things. Of std::string -- and magic numbers -- and constness in references.”

2003
Conv #42

Reusing Streams (with Jim Hyslop),
C/C++ Users Journal, 21(12), December 2003.
There once was a stream reuse style / After close() to re-open() a while / And the questions grew hot: / “Will it open or not? / Is the style ‘clearly’ vile, or worthwhile?”

Conv #41

Pointing in the Right Direction (with Jim Hyslop),
C/C++ Users Journal, 21(11), November 2003.
What’s in a pointer? Not much, really. Raw pointers invite memory leaks – because they cannot tell the programmer how they should be handled.

Mill #29Inline Redux,
C/C++ Users Journal, 21(11), November 2003.
Quick: When is inlining performed? And is it possible to write a function that can be guaranteed to never be inlined? This month, we’ll consider the many and varied opportunities for inlining, including many that are likely to surprise you. The answers, stated simply, are: "It's never too late, and nothing is impossible..."
Conv #40

Self-Sufficient Headers (with Jim Hyslop),
C/C++ Users Journal, 21(10), October 2003.
A good C++ (and C) coding standard is that every header file should be self-sufficient. But is it always so? This article looks at the coding standard, how it applies in the presence of templates and member templates, and how nonmember functions can improve modular dependencies in addition to encapsulation.

 Let's Ship (humor),
C/C++ Users Journal, 21(10), October 2003.
 

C++/CLI Overview,

ISO C++ committee presentation, ISO/IEC JTC1/SC22/WG21 N1557 = ANSI/NCITS J16 03-0140, October 2003.

TNC++ #9

Trip Report: April 2003,
C/C++ Users Journal, 21(10), October 2003.
With 10 new standard library extensions
adopted, things are heating up in Standard C++.

Mill #28

Generalizing Observer,
C/C++ Users Journal, 21(9), September 2003.
The tr1::function facility, recently adopted by the C++ standards committee, provides a generalized way of working with arbitrary functions when all you know (or need to know) is their approximate signature. It turns out that this facility enables us to write, among other things, generalized implementations of important design patterns like Observer. Those generalized design patterns, in turn, motivate two small but important extensions to tr1::function itself.

 

A Name For the Null Pointer: nullptr (with Bjarne Stroustrup),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1488 = ANSI/NCITS J16 03-0071, September 2003.

Conv #39

From C++ to Shining C (with Jim Hyslop),
C/C++ Users Journal, 21(9), September 2003.
So you have a C++ type, and you have a C program that wants to use it. Is it a case of “never the twain shall meet,” or can true objects be reasonably exposed to non-object oriented languages? The twain can indeed meet, and this article shows how.

TNC++ #8

Generalized Function Pointers,
C/C++ Users Journal, 21(8), August 2003.
The function facility, recently adopted by the C++ standards committee, provides a generalized way of working with arbitrary functions when all you know (or need to know) is their signature. In fact, as it turns out, you don’t even need to know the target function’s exact signature – any target function with a compatible signature, meaning one where the parameter and return types are appropriately convertible, will work just fine.

Conv #38

Factory Redux, Part 2 (with Jim Hyslop),
C/C++ Users Journal, 21(8), August 2003.
Revisiting the Template Method factory, with a generic<twist> to it.

Coding In the Dark (humor),
C/C++ Users Journal, 21(8), August 2003.
Mill #27

(Mostly) Private,
C/C++ Users Journal, 21(7), July 2003.
In C++, to what extent are the private parts of a class really truly private? In this month’s column, we see how private names are definitely not accessible from outside nonfriend code, and yet they do leak out of a class in small ways – some of which are well-known, others of which are not.

Conv #37

Factory Redux, Part 1 (with Jim Hyslop),
C/C++ Users Journal, 21(7), July 2003.
Revisiting the Template Method factory, with a generic<twist> to it.

TNC++ #7

Tuples,
C/C++ Users Journal, 21(6), June 2003.
Generalized tuple types are available in other languages, though not in Standard C++. One of the first two library extensions to be adopted by the standards committee since the first standard was closed was tuple types – and it is a testament to the power of C++, particularly the power of C++ templates, that this could be done well entirely as a library, without any changes to the core language.

Conv #36

Imagine (with Jim Hyslop),
C/C++ Users Journal, 21(6), June 2003.
If you want to write portable code, you're going to need a lot of conditional compilation -- #if this, #else that --, right? Imagine if that were not the case...

Conv #35

Delegating Constructors? (with Jim Hyslop),
C/C++ Users Journal, 21(5), May 2003.
Delegating constructors aren’t (yet) supported in the C++ Standard. This article demonstrates the common technique that gets us most of the way there in Standard C++, and its drawbacks. It also demonstrates that Standard C++ does allow two apparent “workarounds” that may look good at first, but which are bad and atrocious, respectively – one of them is a simple mistake, the other an outright appeal to Machiavelli.

Conv #34

Sharing Causes Contention (with Jim Hyslop),
C/C++ Users Journal, 21(4), April 2003.
Following up on themes introduced in the two preceding Conversations columns, the Guru demonstrates why needless sharing might be considered harmful.

Why We Can't Afford Export (with Tom Plum),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1426 = ANSI/NCITS J16 03-0008, March 2003.

Conv #33

Once Is Not Enough (with Jim Hyslop),
C/C++ Users Journal, 21(3), March 2003.
Some reasons why the ubiquitous Singleton Pattern is, perhaps, a little too ubiquitous.

Mill #26

Keywords That Aren't (or, Comments By Another Name),
C/C++ Users Journal Experts Forum, 21(3), March 2003.
All keywords are equal (to the parser), but some are more equal than others. In this article, we see why reserving keywords is important, because keywords are important and special. But we'll also see two keywords that have absolutely no semantic impact on a C++ program.

Conv #32

Points of Order (with Jim Hyslop),
C/C++ Users Journal, 21(2), February 2003.
Of shoes, socks, arguments, and locks: Why order is important in programming as in life.

TNC++ #6

Trip Report: October 2002,
C/C++ Users Journal, 21(2), February 2003.
This month, an update on the most recent C++ standards meeting, and why things are (finally) heating up.

Conv #31

Value Lessons (with Jim Hyslop),
C/C++ Users Journal, 21(1), January 2003.
When is an object not an object? When it is a value. Knowing when to use value types and when to use object types can simplify your design.

Mill #25

Befriending Templates,
C/C++ Users Journal, 21(1), January 2003.
If you want to declare a function template specialization as a friend, how do you do it? According to the C++ Standard, there are two legal syntaxes you can choose from. According to real-world compilers, however, one of the syntaxes is widely unsupported; the other works on all current versions of popular compilers… except one.

2002
 Unmanaged Pointers in C++: Parameter Evaluation, auto_ptr, and Exception Safety,
C/C++ Users Journal, 20(12), December 2002.
A second excerpt from More Exceptional C++ (Items 20 and 21, drawn from the section on Exception Safety Issues and Techniques). In this excerpt, we consider a subtle issue related to parameter evaluation, why just using a smart pointer like auto_ptr doesn’t entirely solve it, and what to do about it.
TNC++ #5

Typedef Templates,
C/C++ Users Journal, 20(12), December 2002.
Here's a detailed look at one of the proposed extensions in C++0x, which closes a small but annoying omission in the language.

Memory (humor),
C/C++ Users Journal, 20(12), December 2002.
Conv #29

Truth or Consequences (with Jim Hyslop),
C/C++ Users Journal, 20(11), November 2002.
What’s wrong with using bool as a parameter? There are usually better ways to express what you mean. This month we turn to an expert who died before Stroustrup was born
.

Mill #24

Export Restrictions, Part 2,
C/C++ Users Journal, 20(11), November 2002.

 

Proposed Addition to C++: Typedef Templates (post-meeting revision incorporating EWG direction),

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1406 = ANSI/NCITS J16 02-0064, October 2002.

TNC++ #4

C and C++: Wedding Bells?,
C/C++ Users Journal, 20(10), October 2002.
For several years now, C and C++ have been following roughly parallel but slightly divergent evolutionary paths. Despite the hype surrounding other languages, C and C++ are still the most widely used commercial programming languages in the world, and they already share a de facto community -- most compiler vendors that support C++ also support C in the same compiler, and a large community of programmers uses both C and C++. But the existing divergences between the languages are worrisome, and if unaddressed could increase further in the up-and-coming versions of those standards, C0x and C++0x. The time is ripe, some influential experts believe, to seriously consider harmonizing Standard C and Standard C++ while still allowing each to address its own vision and strengths.

 

Proposed Addition to C++: Typedef Templates,

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1373 = ANSI/NCITS J16 02-0031, October 2002.

Conv #28

Contracts, Promises, and Mere Semantics (with Jim Hyslop),
C/C++ Users Journal, 20(10), October 2002.
What is a function saying when it takes a parameter by pointer, by reference, or by value?
When interface idioms lie, sometimes there's no graceful way to avoid the surprises.

Conv #27

Baseless Exceptions (with Jim Hyslop),
C/C++ Users Journal, 20(9), September 2002.
Implicit conversion sequences can be quite useful. But there are... well... exceptions to when they are applied.

 

Standard C++ Meets Managed C++,
C/C++ Users Journal, 20(9), September 2002.
Where’s Microsoft going with C++, and where’s C++ going at Microsoft? This article surveys some of the major points of compatibility and incompatibility between Standard C++ and Microsoft’s extensions for C++ on .NET, and how the two might converge more in the future.

Mill #23

Export Restrictions, Part 1,
C/C++ Users Journal, 20(9), September 2002.

TNC++ #3

Smart(er) Pointers,
C/C++ Users Journal, 20(8), August 2002.
This time, we take a closer look at one of the proposed new standard C++ library features being considered in the C++ standards meetings: Smart pointers, particularly those in Boost and Loki. Along the way, we also get a sneak peek at the usefulness of a proposed C++0x feature: typedef templates.

Conv #26

A Midsummer Night's Madness (with Jim Hyslop),
C/C++ Users Journal, 20(8), August 2002.
What do you get when you add a pointer to a typedef and mix in const? The Guru puts in her thoughts on the matter.

Mill #22

A Pragmatic Look at Exception Specifications,
C/C++ Users Journal, 20(7), July 2002.
Now that the community has gained experience with exception specifications, it's time to reflect on when and how they should best be used. This article considers the usefulness, or lack thereof, of exception specifications, and how the answers can vary across real-world compilers.

Conv #25

Getting to the Point (with Jim Hyslop),
C/C++ Users Journal, 20(7), July 2002.
While the standard auto_ptr provides a safer alternative to raw pointers, it has its limitations, and some surprising behavior. The Guru helps out by giving the narrator a boost – library, that is. The Boost library has five smart pointers that provide a rich array [sic] of useful behaviors.

Conv #24

The Good, the Bad, and the Deprecated (with Jim Hyslop),
C/C++ Users Journal, 20(6), June 2002.
What can go wrong when your code gives you a bit too much... er... static.

Mill #21

Toward a Standard C++0x Library, Part 2: Namespaces and Library Versioning,
C/C++ Users Journal, 20(5), May 2002.
(How) can you use namespaces effectively to release new versions of a library that can live peacefully with older versions? This is precisely one of the challenges now facing the C++ standard library as work begins on a major round of extensions.

Conv #23

Making a Real Hash of Things (with Jim Hyslop),
C/C++ Users Journal, 20(5), May 2002.
Speed often does matter. But what kind of "speed" is important when it comes to associative containers?

TNC++ #2

The Group of Seven: Extensions Under Consideration for the C++ Standard Library,
C/C++ Users Journal, 20(4), April 2002.
At the October 2001 C++ standards meeting, we began to consider proposals for extensions to the C++ standard library. The first batch consisted mainly of seven particular facilities. This column gives an overview of these facilities; next time, we'll take a closer look at one in particular.

Conv #22

To Sleep, Perchance (with Jim Hyslop),
C/C++ Users Journal, 20(4), April 2002.
Just how many threading and streaming mistakes can arise in one poor little dozen-line function? Quite a few, and that's not even counting the magic...

 Review of Alexandrescu's Modern C++ Design,
C/C++ Users Journal, 20(4), April 2002.
My review of Andrei's landmark book.
Not the JVM (humor),
C/C++ Users Journal, 20(4), April 2002.

Namespaces and Library Versioning,

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1344 = ANSI/NCITS J16 02-0002, March 2002.

Conv #21

Template Specializations, Default Parameters, and Other Fun Stuff (with Jim Hyslop),
C/C++ Users Journal, 20(3), March 2002.
Many people know how to partially specialize a template. But what happens when the base template has a template parameter with a default value? The answer may not be quite what Bob expected...

Extensible Templates: Via Inheritance or Traits?
C/C++ Users Journal, 20(2), February 2002.
Excerpted from More Exceptional C++ (Item 4, drawn from the opening section on Generic Programming and the C++ Standard Library), a discussion of traits templates and some cool traits techniques.
TNC++ #1

The New C++,
C/C++ Users Journal, 20(2), February 2002.
A new C++ Standard library and language are now in the making. This is a fitting time to introduce "The New C++," a new column dedicated to keeping you up to date with the latest status of the coming brand-new release of the C++ Standard.

Conv #20

New Bases, Part 2 (with Jim Hyslop),
C/C++ Users Journal, 20(2), February 2002.
Basic reading and writing from a standard stream sounds simple, but can harbor its share of little complexities. Here is a simple example, with notes about the kinds of complexity that can usually be deferred.

The Naming of Types (humor),
C/C++ Users Journal, 20(2), February 2002.
Mill #20

Toward a Standard C++0x Library, Part 1,
C/C++ Users Journal, 20(1), January 2002.
The C++ standard library is going to be extended, and work in that direction is now officially under way. This article outlines some of the issues and choices involved, and how they may affect you.

Conv #19

New Bases, Part 1 (with Jim Hyslop),
C/C++ Users Journal, 20(1), January 2002.
Converting a text-represented number from one base to another is pretty simple. But how extensible and reusable can the solution be to solve more than one problem, when there are also additional requirements?

2001
Conv #18

I'd Hold Anything for You (with Jim Hyslop),
C/C++ Users Journal, 19(12), December 2001.
There are occasions when you have a variable whose type you don't know until run time. Thanks to the Boost library, there is a safe alternative to fragile union- or void*-based solutions.

Mill #19The String Formatters of Manor Farm,
C/C++ Users Journal, 19(11), November 2001.
An Orwellian look at the mysteries of sprintf(), snprintf(), std::stringstream, std::strstream, and boost::lexical_cast.
Conv #17Hungarian wartHogs (with Jim Hyslop),
C/C++ Users Journal, 19(11), November 2001.
What's in a name? Plenty, if you use Hungarian notation. Too much, if you use Hungarian notation.
Conv #16Al-Go-Rithms (with Jim Hyslop),
C/C++ Users Journal, 19(10), October 2001.
The Standard C Library contains some functions that are still useful in C++. Sometimes, though, you need to find your own 'rithm - algorithm, that is.
Mill #18Virtuality,
C/C++ Users Journal, 19(9), September 2001.
Why should interfaces be nonvirtual? Why should virtuals be private? And what's with the old and hoary advice about base class destructors, and is the old hoary advice really true?
Conv #15Back To Base-ics (with Jim Hyslop), 
C/C++ Users Journal, 19(9), September 2001.
Conv #14The Bind That Ties (with Jim Hyslop), 
C/C++ Users Journal, 19(8), August 2001.
Mill #17Why Not Specialize Function Templates?
C/C++ Users Journal, 19(7), July 2001.
Conv #13How to Persist an Object (with Jim Hyslop), 
C/C++ Users Journal, 19(7), July 2001.
Conv #12Abstract Factory, Template Style (with Jim Hyslop), 
C/C++ Users Journal, 19(6), June 2001.
Mill #16 To New, Perchance To Throw, Part 2
C/C++ Users Journal, 19(5), May 2001.
Conv #11Roots (with Jim Hyslop), 
C/C++ Users Journal, 19(5), May 2001.
C++ Compiler Conformance Roundup,
C/C++ Users Journal, 19(4), April 2001.
Conv #10Manipulations (with Jim Hyslop), 
C/C++ Users Journal, 19(4), April 2001.
Mill #15 To New, Perchance To Throw, Part 1
C/C++ Users Journal, 19(3), March 2001.
Conv #9Redirections (with Jim Hyslop), 
C/C++ Users Journal, 19(3), March 2001.
Conv #8Access Restrictions (with Jim Hyslop), 
C/C++ Users Journal, 19(2), February 2001. 
Mill #14 Containers In Memory: How Big Is Big? 
C/C++ Users Journal, 19(1), January 2001.
Conv #7Obelisk (with Jim Hyslop), 
C/C++ Users Journal, 19(1), January 2001.
2000
Conv #6Virtually Yours (with Jim Hyslop), 
C/C++ Users Journal, 18(12), December 2000.
Mill #13
Constructor Failures (or, The Objects That Never Were)
C/C++ Users Journal, 18(11), November 2000.
Conv #5By Any Other Name (with Jim Hyslop), 
C/C++ Users Journal, 18(11), November 2000.
Migrating To Namespaces
Dr. Dobb's Journal, 25(10), October 2000.
Conv #4So Who's the Portable Coder? (with Jim Hyslop), 
C/C++ Users Journal, 18(9), September 2000.
The C Family of Languages: Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling,
Java Report, 5(7), July 2000; and
C++ Report, 12(7), July/August 2000.
Conv #3Genesis (with Jim Hyslop), 
C++ Report, 12(7), July/August 2000.
Conv #2Null References (with Jim Hyslop), 
C++ Report, 12(6), June 2000.
Conv #1Re-membering auto_ptr (with Jim Hyslop), 
C++ Report, 12(4), April 2000.
Mill #12
Widgets, Inheritance, and Writing Safe Code
C++ Report, 12(3), March 2000. 
Effective Memory Management
Visual C++ Developers Journal
, 2(1), January/February 2000.
1999
Using auto_ptr Effectively,
C/C++ Users Journal, 17(10), October 1999.
 

vector<bool>: More Problems, Better Solutions,

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1211 = ANSI/NCITS J16 99-0035, October 1999.

Mill #11
Standard Library News, Part 2: Sets and Maps
C++ Report, 11(9), October 1999.
Mill #10
Standard Library News, Part 1: Vectors and Deques
C++ Report, 11(7), July/August 1999.
Optimizations That Aren't (In a Multithreaded World)
C/C++ Users Journal, 17(6), June 1999.
Mill #9
When Is a Container Not a Container?
C++ Report, 11(5), May 1999.
Mill #8
Namespaces and the Interface Principle
C++ Report, 11(3), March 1999.
 

vector<bool> Is Nonconforming, and Forces Optimization Choice,

ISO C++ committee paper, ISO/IEC JTC1/SC22/WG21 N1185 = ANSI/NCITS J16 99-0008, February 1999.

Mill #7

Uses and Abuses of Inheritance, Part 2
C++ Report, 11(1), January 1999.
1998
Mill #6
Uses and Abuses of Inheritance, Part 1
C++ Report, 10(9), October 1998.
Advice From the C++ Experts: Be Const-Correct
C++ Report, 10(9), October 1998.
Mill #5
The Joy of Pimpls (or, More About the Compiler-Firewall Idiom)
C++ Report, 10(7), July/August 1998.
Mill #4
Pimpls - Beauty Marks You Can Depend On
C++ Report, 10(5), May 1998.
Mill #3Review: The BOOSE Programming Language
C++ Report, 10(4), April 1998.
Mill #2
What's In a Class? - The Interface Principle
C++ Report, 10(3), March 1998.
Mill #1C++ State of the Union
C++ Report
, 10(1), January 1998.

1997 & prev.

More Exception-Safe Generic Containers
C++ Report, 9(10), November/December 1997.
Advice From the C++ Experts: Write What You Know, and Know What You Write
C++ Report, 9(9), October 1997.
Writing Exception-Safe Generic Containers
C++ Report, 9(8), September 1997.
Several Migrating to Object Technology feature articles, 
The Computer Freelancer, 1995-1997.
 

Copyright © 2011 Herb Sutter