jeff_

jeff_ 查看完整档案

九江编辑  |  填写毕业院校  |  填写所在公司/组织 www.flowerdeer.cn/ 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

jeff_ 赞了回答 · 4月25日

解决c/c++ 柔性数组 问题

我查资料发现柔性数组是没有分配地址的,

“没有分配地址”是什么意思 ....

这个最后的位置长度的数组,再计算大小的时候,结果为 0 。

请问为什么不管结构体test4 里面有都多少成员,指针p4+1的结果都是指向最后的柔性数组。

数组指针+1指向下一个成员,结构体指针+1为什么指向了最后?

这俩是一个问题:下一个成员的开始,不就是前一个成员的最后 ...

然后,“数组指针”是想说“指向数组成员的指针嘛 ...
再进行指针运算的时候,如果指针指向的不是一个数组成员,视为指向长度为1的数组的成员。

这是编译器优化的行为还是标准定义?

这个结构最后的没有长度的数组是 C 的,C++ 并没有。g++ 自己按照 C 的实现做的扩展。

关注 2 回答 1

jeff_ 赞了回答 · 4月14日

解决在堆中, 当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?

我想你把内存的生长方向与操作逻辑搞混了,这是两件事,堆跟栈的生长方向不同,是指分配的方向不同。但是对于一个变量或者一段内存块来说,不管在哪里,操作逻辑是相同的,操作逻辑,不会因为栈区或堆区而搞差异化操作,没必要并且也不应该有差异。
大小端是关系到数据的存放顺序,a1~4的输出,小端是4321,大端是1234,跟你的问题没关系
申请堆内存可以用malloc或者new

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int a=0x01020304;
  
  unsigned char* a1=(unsigned char*)(&a);
  unsigned char* a2=(a1+1);
  unsigned char* a3=(a1+2);
  unsigned char* a4=(a1+3);
  
  
  printf("a:%x\n",  a);
  printf("a1:%d\n", *a1);
  printf("a2:%d\n", *a2);
  printf("a3:%d\n", *a3);
  printf("a4:%d\n", *a4);
  
  unsigned int* b = (unsigned int*)malloc(sizeof(unsigned int));
  *b = 0x01020304;
  
  unsigned char* b1=(unsigned char*)b;
  unsigned char* b2=(b1+1);
  unsigned char* b3=(b1+2);
  unsigned char* b4=(b1+3);
  
  printf("b:%x\n",  *b);
  printf("b1:%d\n", *b1);
  printf("b2:%d\n", *b2);
  printf("b3:%d\n", *b3);
  printf("b4:%d\n", *b4);
  
  free(b);
  
  return 0;
}

输出:

a:1020304
a1:4
a2:3
a3:2
a4:1
b:1020304
b1:4
b2:3
b3:2
b4:1

关注 3 回答 1

jeff_ 提出了问题 · 4月14日

解决在堆中, 当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?

已知

当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?在栈中指针指向的是最低地址的那个字节(大概知道是因为push的原因)

void main()
{
  int a=0x01020304;
  
  unsigned char* a1=(unsigned char*)(&a);
  unsigned char* a2=(a1+1);
  unsigned char* a3=(a1+2);
  unsigned char* a4=(a1+3);
  
  
  printf("a:%x\n",  a);
  printf("a1:%d\n", *a1);
  printf("a2:%d\n", *a2);
  printf("a3:%d\n", *a3);
  printf("a4:%d\n", *a4);
  
  return ;
}

输出结果:
image.png

提问

在堆中的实现不知道怎么写。

请教下:

  1. 当一个变量占多个字节的内存时,变量的指针指向的是高地址还是低地址?在堆中指针指向的是否也是最低地址的那个字节?
  2. 是否一个变量占多个字节都是从低到高?另外大小端有区别吗?
  3. 编译器一般对堆内存会怎么处理?

关注 3 回答 1

jeff_ 回答了问题 · 3月21日

解决在automake找不到.h头文件

应该是同级目录会自动导入.h文件。configure.ac 不需要添加 AC_CHECK_HEADERS([hello.h]),Makefile.amhello_SOURCES=hello.cpp hello.h 、hello_CPPFLAGS = -I/home/shiyanlou/automake 也只需要hello_SOURCES=hello.cpp 即可。 就是不知道 AC_CHECK_HEADERS 这是啥时候需要添加的了。

我参考个视频:
https://www.youtube.com/watch...

关注 1 回答 1

jeff_ 提出了问题 · 3月21日

解决在automake找不到.h头文件

在网上看了使用autoconf 和 automake 生成 Makefile 文件的文章,但大多都是只有一个.c文件的。 我自己加了个.h文件(和.cpp在同级目录)编译,但是运行./configure 时报错。

image.png

请教下大家这个.h文件应该怎么添加。
image.png

下面是我的Makefile.am文件

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.cpp hello.h
hello_CPPFLAGS = -I/home/shiyanlou/automake

以及我的configure.ac文件

\# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([hello], [1.0], [zhang6333778@gmail.com])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([hello.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT(Makefile)```

以及我使用命令生成的文件:

![image.png](/img/bVbERFf)

关注 1 回答 1

jeff_ 赞了回答 · 2月26日

解决关于右值、精确传递 (Perfect Forwarding)请教

std::forward函数通过类型推导+引用折叠等机制,最终会将你传入的T所具有的属性原封不动的传递下去,这就是精确传递(也叫做完美转发),move和它是一个层面的东西,仅是推导过程会将传入的T推导(update:推导这里用的不严谨,应该是通过类型萃取获得其原始类型的右值引用类型)为右值引用类型(type)的右值(value category)。
要理解这个东西你要先明白value category的机制 + 模板类型推导的机制 + 引用折叠的机制 + 左值/右值引用的机制,然后你打开任何一个版本的std::move和std::forward,能用上述机制推导出这两个函数是如何达到目的的就算理解了。
不是我刻意要回复的复杂,而是这个问题就是这么麻烦。。。推荐你一本书《effective modern c++》里面的相关章节能帮到你。

关注 2 回答 2

jeff_ 关注了问题 · 2月26日

贪心之影分身过河

我遇到一个算法题,感觉应该用贪心的思想做,但是用代码实在不知道怎么写,恳请大神们给一点思路。

问题描述

鸣人学会了影分身之术,召唤出了n个鸣人的分身,他想知道这些分身们能有多少渡过江面到达对岸。
鸣人的分身们可以两两配对,让一个分身先跳跃到空中,另一个分身跳跃到他的背上,踩背进行二次跳跃。虽然这样牺牲了一个分身,不过可以让更多的分身渡江。
请问鸣人的分身最多能有多少渡江?

输入

第一行输入正整数n与d(n<=10^6,d<=10^9),其中d表示离对岸的距离。
接下来n行,每行两个整数x与y(0<=x,y<=10^9),分别表示该分身第一次跳跃的最远距离和踩背二次跳跃的最远距离。

输出

输出鸣人的分身最多能有多少渡江。

样例展示

5 10
6 8
2 100
7 3
1 10
2 5

答案

2

关注 2 回答 0

jeff_ 提出了问题 · 2月25日

解决关于右值、精确传递 (Perfect Forwarding)请教

刚刚看了篇关于精确传递 (Perfect Forwarding)的文章,有点不理解的请教下大家。

文章中提到:精确传递适用于这样的场景:需要将一组参数原封不动的传递给另一个函数。

我自己写了个测试程序

 #include <iostream>
 #include <string>
 #include <type_traits>
 using namespace std;

/*
template <typename T>
int process_value(T&& val){
   cout << typeid(val).name() << endl;
   return 1;
}
*/

void process_value(int& i) {
 std::cout << "LValue processed: " << i << std::endl;
}
void process_value(const int& i) {
 std::cout << "const LValue processed: " << i << std::endl;
}
void process_value(int &&i) {
 std::cout << "RValue processed: " << i << std::endl;
}
void process_value(const int &&i) {
 std::cout << "const RValue processed: " << i << std::endl;
}

/*
template <typename T> void forward_value(const T& val) {
  cout << "const T&"<<endl;
  process_value(val);
}
*/

template <typename T> void forward_value(T&& val) { 
//      cout << "T&&" <<endl;
        process_value(val); 
}


int main(){
        int a = 0; 
        const int &b = 1; 
        forward_value(a); // int& 
        forward_value(b); // const int& 
        forward_value(2); // int&&

        return 0;
}

结果是:
image.png

请问下:
forward_value(2) 这里常量2不是应该是个右值嘛?

根据上文:精确传递将一组参数原封不动的传递给另一个函数。forward_value(T&& val) 传递给 process_value(val) 的参数不应该还是右值嘛?所以不是应该调用process_value(int &&i)函数嘛?为什么调用的是process_value(int& i)函数?

参考文章链接精确传递 (Perfect Forwarding)

关注 2 回答 2

jeff_ 赞了回答 · 1月21日

解决C++创建临时对象问题?

通常,声明变量会使用 int a; 。但是,使用 int (a); 同样是合法的。

于是,A(str); 就有了两种可能的解释,声明一个变量 str,类型为 A ;或者构造一个类型为 A 的临时变量,并将 str 作为构造函数的参数。在有这种歧义的时候,C++ 总是认为这是一个变量声明。

A("absf") 并没有这种歧义,它不能被解释为变量声明。

关注 4 回答 2

jeff_ 关注了用户 · 1月19日

fefe @fefe_5d0b30d7515e7

关注 55

认证与成就

  • 获得 1 次点赞
  • 获得 10 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 10 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2019-03-19
个人主页被 306 人浏览