小编bur*_*n16的帖子

限制std :: string分配的数量

我有构造一个函数std::string从一个const char*与两个数字,作为参数传递,追加到它的结束.

std::string makeName(const char* name, uint16_t num1, uint16_t num2) {

    std::string new_name(name);
    new_name.reserve(new_name.length()+5);

    new_name += ":";
    new_name += boost::lexical_cast<std::string>(num1);
    new_name += ":";
    new_name += boost::lexical_cast<std::string>(num2);

    return new_name;
}
Run Code Online (Sandbox Code Playgroud)

该函数被调用数千次,以便为堆上分配的小对象创建唯一的名称.

Object* object1= new Object(makeName("Object", i, j)); // i and j are simply loop indices
Run Code Online (Sandbox Code Playgroud)

我发现使用valgrind的massif工具调用makeName会分配大量内存,因为它被调用了很多次.

87.96% (1,628,746,377B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.

->29.61% (548,226,178B) 0xAE383B7: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)

| ->26.39% (488,635,166B) 0xAE38F79: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)

| | …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind allocation stdstring

8
推荐指数
1
解决办法
525
查看次数

如何在具有最终字段的抽象类上使用 Lombok @SuperBuilder

给定以下带有 Lombok 注释的类@Data@SuperBuilder

@Data
@SuperBuilder
public abstract class Parent {

    protected final String userId;
    protected final Instant requestingTime;
}

@Data
@SuperBuilder
public class Child extends Parent {

    private final Instant beginningDate;
    private final Instant endingDate;
    private final Collection<String> fields;
}

Run Code Online (Sandbox Code Playgroud)

@DataChild类中的注释上出现以下错误:

隐式超级构造函数 Parent() 未定义。必须显式调用另一个构造函数。

有没有办法在Child类的@Data注释上配置非默认构造函数,以便在调用 Builder 时初始化和类final上的所有字段?ChildParent

我已经尝试了@Data, @Getter,@Setter注释与@SuperBuilder子类和父类上的注释的几种不同组合,但还没有找到可行的解决方案。我正在使用 Lombok 1.18.10。

作为参考,这个问题是相关的

编辑

这实际上是 Lombok 应该在 …

java design-patterns builder lombok

6
推荐指数
1
解决办法
7361
查看次数

在共享内存进程中分配字符串

我有一个程序需要在两个进程之间共享一个字符串.我已经声明了一个包含数组的结构*char.在主进程分叉之前shmgetshmat之前分配此结构.

typedef struct Queue
{
    int index;
    char *directory[10];
} Queue;
Run Code Online (Sandbox Code Playgroud)

在其中一个进程中,我尝试设置值:( data->dir_name*char一个字符串,如"/ data1")

queue->directory[i] = data->dir_name; // Option 1
queue->directory[i] = "foo";          // Option 2
Run Code Online (Sandbox Code Playgroud)

我的问题是,上面的第一个和第二个陈述之间有什么区别?当设置queue->directory[i]"foo",其他进程看到它.但是,传递值data->dir_name,它没有.

提前致谢!

c string shared-memory

5
推荐指数
1
解决办法
1353
查看次数

使用CMake在构建后运行C++程序

我有一个用C++编写的应用程序,我使用CMake来构建和发布二进制文件.

我想让CMakeLists.txt脚本编译并运行一个CPP文件,该文件用于在为应用程序构建二进制文件后对许可证文件加时间戳并加密.我见过运行execute_process命令的例子,例如:

execute_process(COMMAND "gcc -o foo foo.cpp"
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
execute_process(COMMAND "./foo"
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                RESULT_VARIABLE MY_FOO_VAR)
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual Studio 2010在Windows上进行构建.问题是我不确定如何在VS的构建过程中让CMake运行程序.我希望构建操作中的最后一件事是许可文件时间戳,但我对VS或CMake的了解还不够.

c++ build-process cmake visual-studio-2010 post-build-event

5
推荐指数
1
解决办法
8034
查看次数